获取javascript对象中的最后一项


93

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

{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }

如果我事先不知道列表会升至'c',而不是遍历对象,是否有办法获取对象中的最后一项(例如'carrot')?


这是个好问题。另外,除了遍历对象外,如何检查对象是否为空?
卢卡斯·埃德

2
属性不是“项目”。不,属性顺序未定义。
免费咨询2010年

我要说的是他指的最后一个财产价值
KooiInc 2010年

Answers:


64

不能。在JSON和大多数其他键值数据结构中不能保证顺序,因此,最后一项有时可能是,carrot而在其他时候是banana等等。如果您需要依赖排序,那么最好的选择就是使用数组。键值数据结构的功能在于按其访问值keys,而不在于能够获取nth对象的项。


1
作为对此完全正确答案的扩展。对象不是数组,即使您使用数组标记在JS中创建关联数组,[]它实际上也是一个对象。JS没有这样的关联数组,数组具有索引访问和序列;对象具有关联属性访问,非顺序访问。
2010年

3
我知道不能保证它们有顺序,但是如果我可以实际控制对象的创建,则可以确保它们处于特定顺序。显然,这个问题的答案是“否”。:)
sprugman

2
@sprugman:不在Chrome中。关于该主题的争论一直持续很长时间:code.google.com/p/v8/issues/detail?id=164
Tim Down 2010年

216

是的,有一种使用的方法Object.keys(obj)对此页面进行了说明:

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

如果要获取最后一个对象的值,可以执行以下操作:

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"

8
这个应该已经被接受了,Object.keys效果很棒。只是必须找到一种使其在IE8和7上运行的方法,因为这仅在IE9上显示。
RaphaelDDL

4
您可以直接使用Object.values(fruitObject)进行操作,该方法将返回值而不是键,然后对您的数组执行pop()以返回最后一个元素。
伊冯·休恩

4
这里的第一个答案是正确的答案。我尝试Object.keys一遍又一遍地使用,只是发现这些属性实际上是随机排列的。实际的属性顺序不同于登录到浏览器控制台时显示的顺序。登录浏览器控制台后,属性会自动重新排序并按字母/数字顺序显示,这无疑会引起一些混乱。
kennsorr

1
JS规范不保证键的顺序,并且在不同的实现(引擎)之间可能会有所不同。因此,不可能保证随机生成(键控)对象的插入顺序。数组是一种对象,其中键是数字索引,以确保其他有用属性之间的插入顺序。
阮经卫生署

1
早在2010-2013
Merc

22
last = Object.keys(obj)[Object.keys(obj).length-1];

obj是您的对象


1
这样就得到了最后一个键('c'在这种情况下),但是问题的措辞暗示着发问者正在寻找最后一个值('carrot')。这也并没有真正添加Kristina Stefanova的答案
bmaupin


10

使用ES6的解构分配语法的解决方案:

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


5

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

元素在“ for(…in…)”循环中排序

特别:

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

因此,这里的所有其他答案都是正确的,没有官方保证的对象属性顺序。但是在实践中还是存在(禁止任何自然会破坏正式规定行为的错误)。

此外,对象属性的实际枚举顺序可能会在将来的EMCAScript规范中进行编码。

尽管如此,此时我仍不会编写代码,主要是因为没有内置的工具来帮助处理对象属性顺序。您可以编写自己的属性,但最后,您总是会遍历对象中的每个属性以确定其位置。

因此,您的问题的答案为,除了循环遍历对象外,别无其他方法。


如您所说,我绝对不会依赖任何顺序来进行对象属性枚举。首先,新的ECMAScript实现没有义务遵循该事实标准,因此依赖于特定顺序的代码并不是面向未来的。此外,并非所有当前浏览器的行为都相同。请参阅有关Chrome错误跟踪器的讨论:code.google.com/p/v8/issues/detail?id=164。最后,我不希望ECMAScript规范能够在不久的将来对此进行标准化。
Tim Down

5

如果顺序很重要,请使用数组,而不是对象文字。

list = ['apple', 'banana', 'carrot'];

或类似的东西

dict = {
 'a' : ['apple', 'awesome'],
 'b' : ['best friend']
};

甚至..

dict = [{letter:'a', list:['apple', 'awesome']},{letter:'b', list:['best friend']}];

dict不能保证所有的键都是有序的。


5

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

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


5

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

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

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]

3
JSArray = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };  
document.write(Object.keys(JSArray)[Object.keys(JSArray).length-1]);// writes 'c'   
document.write(JSArray[Object.keys(JSArray)[Object.keys(JSArray).length-1]]); // writes 'carrot'

1

您还可以使用以下Object.values()方法:

Object.values(fruitObject)[Object.values(fruitObject).length - 1]; // "carrot"

0

JavaScript中的Map对象 。现在已经3岁了。此地图数据结构保留插入项目的顺序。通过此检索,最后一个项目实际上将导致在地图中插入最新的项目



0

如果您的意思是按字母顺序获取最后一个键,则可以(保证):

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var keys = Object.keys(obj);
keys.sort();
var lastkey = keys.pop() // c
var lastvalue = obj[lastkey] // 'carrot'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.