获取javascript对象中的最后一项

spr*_*man 81 javascript object

如果我有一个像这样的对象:

{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }
Run Code Online (Sandbox Code Playgroud)

如果我事先不知道列表上升到'c',除了遍历对象之外,有没有办法获取对象中的最后一项(例如'carrot')?

小智 194

是的,有一种方法可以使用Object.keys(obj).本页对此进行了解释:

var fruitObject = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
Object.keys(fruitObject); // this returns all properties in an array ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

如果要获取最后一个对象的值,可以这样做:

fruitObject[Object.keys(fruitObject).length-1] // "carrot"
Run Code Online (Sandbox Code Playgroud)

  • 这个应该是被接受的,'Object.keys`工作得很棒.只需要找到一种方法让它在IE8和7上运行,因为它只出现在IE9上. (6认同)
  • [这里的第一个答案](/sf/ask/302221951/#answer-4317488) 是正确答案。我一遍又一遍地尝试使用“Object.keys”,结果发现这些属性实际上是随机排序的。实际的属性顺序与登录到浏览器控制台时显示的不同。当登录到浏览器控制台时,属性会自动重新排序并按字母/数字显示,这肯定会引起一些混乱。 (6认同)
  • 您可以直接使用Object.values(fruitObject)来返回值而不是键,然后对数组执行pop()以返回最后一个元素. (3认同)
  • JS 规范不保证密钥的顺序,并且它在不同的实现(引擎)之间可能有所不同。因此,不可能保证随机生成(键控)对象的插入顺序。数组是一种对象,其中键是数字索引,以保证其他有用属性之间的插入顺序。 (2认同)
  • 天哪,人们在 2010 年至 2013 年进行 Web 开发时遇到了困难...... (2认同)

Ale*_*lex 59

否.在JSON和大多数其他键值数据结构中不保证顺序,因此最后一项有时可能carrot在其他时间,有时banana也是等等.如果您需要依赖订购,最好的选择是使用数组.键值数据结构的强大之处在于通过它们访问值keys,而不是能够获取nth对象的项目.

  • 我知道不能保证它们有顺序,但是如果我可以控制对象的创建,实际上,我可以确保它们按特定顺序排列。显然,这个问题的答案是否定的。:) (4认同)
  • 对于那些 10 年前浏览过此页面的人:答案应该更新。现在标准保证了对象属性的顺序。另外,问题不是关于 JSON 的。 (3认同)
  • 作为这个完全正确答案的扩展。对象不是数组,即使您在 JS 中使用数组标记 `[]` 创建关联数组,它也确实是一个对象。JS 本身没有关联数组,数组有索引访问和序列;对象具有关联属性访问,非顺序的。 (2认同)
  • @sprugman:不在 Chrome 中。关于这个主题的长期激烈辩论一直在激烈进行:http://code.google.com/p/v8/issues/detail?id=164 (2认同)

小智 18

last = Object.keys(obj)[Object.keys(obj).length-1];
Run Code Online (Sandbox Code Playgroud)

obj是你的对象

  • 这将获得最后一个键(在本例中为“c”),但问题的措辞暗示询问者正在寻找最后一个值(“胡萝卜”)。这也没有真正添加 [Kristina Stefanova 的回答] (/sf/answers/1161319071/) 尚未涵盖的任何内容 (3认同)

小智 13

var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";
Run Code Online (Sandbox Code Playgroud)

来源:http://javascriptweblog.wordpress.com

  • "除了循环对象" (2认同)
  • 对于那些需要获取对象的第一个键的人可以按照上面的方式进行操作,但是:`for(myObj中的firstProperty){break; };` (2认同)

Bri*_*ian 12

其他答案对我来说过于复杂。

let animals = {
  a: 'dog',
  b: 'cat',
  c: 'bird'
}

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]
Run Code Online (Sandbox Code Playgroud)


oll*_*rev 7

使用ES6的解构赋值语法的解决方案:

var temp = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var { [Object.keys(temp).pop()]: lastItem } = temp;
console.info(lastItem); //"carrot"
Run Code Online (Sandbox Code Playgroud)


Sha*_*Pal 6

你可以试试这个。这将存储最后一个项目。这里需要将 obj 转换为数组。然后使用数组pop()函数从转换后的数组中返回最后一项。

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var last = Object.keys(obj).pop();
console.log(last);
console.log(obj[last]);
Run Code Online (Sandbox Code Playgroud)


med*_*iev 5

如果订单很重要,请使用数组,而不是对象文字.

list = ['apple', 'banana', 'carrot'];
Run Code Online (Sandbox Code Playgroud)

或类似的东西

dict = {
 'a' : ['apple', 'awesome'],
 'b' : ['best friend']
};
Run Code Online (Sandbox Code Playgroud)

甚至..

dict = [{letter:'a', list:['apple', 'awesome']},{letter:'b', list:['best friend']}];
Run Code Online (Sandbox Code Playgroud)

dict根本不保证钥匙的顺序.


Moo*_*Goo 5

至于Javascript中对象属性的排序,我将链接到这个答案:

元素在"for(... in ...)"循环中排序

特别:

ECMAScript的所有现代实现都按照定义它们的顺序迭代对象属性

所以这里的每个其他答案都是正确的,没有官方保证订单来反对属性.然而,在实践中存在(除非任何错误自然会搞砸甚至一塌糊涂的官方指定行为).

此外,对象属性的事实上的枚举顺序很可能在未来的EMCAScript规范中编纂.

但是,此时我不会围绕此编写代码,主要是因为没有内置工具来帮助处理对象属性顺序.你可以编写自己的,但最后你总是循环遍历一个对象中的每个属性来确定它的位置.

这样的回答你的问题是没有,有除了通过对象循环没有办法.