具有最大数字索引的元素

时间:2012-11-11 22:19:43

标签: javascript arrays object

如何找到JavaScript对象中的最后一个元素,如果用“last”我认为索引最大的那个元素?即我收到一个类似于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,那也没关系。

6 个答案:

答案 0 :(得分:3)

这与zzzzBov和DavidMüller的代码类似,但使用库函数确实缩短了它的时间:

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

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

答案 1 :(得分:1)

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

话虽如此,一般来说,你的问题的答案是:你做不到。您可以做的是迭代所有属性并找到最后一个属性或您感兴趣的任何属性(请参阅:How to Loop through plain JavaScript object with objects as members?)。但请记住,在迭代期间不必保留声明属性的顺序。

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

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

var last = received[received.length - 1];

答案 2 :(得分:1)

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

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

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

答案 3 :(得分: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);

答案 4 :(得分: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>

答案 5 :(得分: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
}());