2

如果通过“最后一个”我认为索引最大的元素,我如何找到 JavaScript 对象中的最后一个元素?即我收到一个类似于 ajax 上的数组的对象(作为 json),但它也有一个非数字键:

var received = {
   0: 'something',
   1: 'something else',
   2: 'some stuff',
   3: 'some more stuff',
   'crap' : 'this screws the whole thing'
}

如果它是一个普通数组,我会使用array.length. 同样,我可以简单地逐个元素地迭代来找到它。

有没有更好的办法?如果解决方案需要 jQuery,那也没关系。

4

6 回答 6

3

这类似于 zzzzBov 和 David Müller 的代码,但使用库函数确实使它更短:

Math.max.apply(null, Object.keys(test).filter(isFinite)) // 3

如果您有具有可枚举扩展原型对象的对象(结果不是这种情况JSON.parse),您可能希望使用它Object.getOwnPropertyNames

于 2012-11-11T22:35:23.803 回答
1

这不是一个数组,它是一个对象字面量。此外,对象字面量中的项目顺序不能保证在创建后保留(尽管大多数浏览器似乎都遵守这一点)。

话虽这么说,通常你的问题的答案是:你不能。您可以做的是遍历所有属性并找到最后一个或您感兴趣的任何一个(请参阅:如何以对象为成员循环遍历纯 JavaScript 对象?)。但请记住,在迭代期间不必保留声明属性的顺序。

但是,如果这是一个真正的数组(忽略'crap'键),那很容易:

received = [
 'something',
 'something else',
 'some stuff',
 'some more stuff'
];

var last = received[received.length - 1];
于 2012-11-11T22:21:36.007 回答
1

对于数组(使用[], not创建{}),该length属性比分配的最后一个索引多一个。所以:

var a = [];
a[0] = 'something';
a[5] = 'else';
a["foo"] = 'bar';
console.log(a.length);

将打印“6”,即使数组中只有两个元素并且foo属性设置为'bar'. length 属性仅受数字索引的影响。

于 2012-11-11T22:25:00.310 回答
1
var received = {
   0: 'something',
   2: 'some stuff',
   3: 'some more stuff',
   1: 'something else',
   'crap' : 'this screws the whole thing'
};

var prop,
    max = -1;
for ( prop in received ) {
  if ( Object.prototype.hasOwnProperty.call(received, prop) && !isNaN(prop) ) {
    max = Math.max(max, prop);
  }
}

console.log(max);
于 2012-11-11T23:02:30.323 回答
0

这当然不是最优雅的方法,但如果必须坚持文字,你别无选择

<script>
var received = {
   0: 'something',
   1: 'something else',
   2: 'some stuff',
   3: 'some more stuff',
   'crap' : 'this screws the whole thing'
};

var max = null;

for (var i in received)
{
    if (received.hasOwnProperty(i) && !isNaN(i))
    {
        if (max == null || i > max)
            max = i;
    }
}

if (max)
    alert(received[max]); //some more stuff
</script>
于 2012-11-11T22:26:38.430 回答
0

如果您想知道哪个项目具有最大的数字索引值,则必须遍历对象中的所有键:

(function () {
    var i,
        o,
        temp;
    o = getYourObject();
    temp = -Infinity; //lowest possible value
    for (i in o) {
        if (o.hasOwnProperty(i) &&
            !isNaN(i) &&
            +i > temp) {
            temp = +i;
        }
    }
    console.log(temp); //this is the key with the greatest numeric value
}());
于 2012-11-11T22:27:12.173 回答