循环访问对象数组

Iterating over an array of objects

本文关键字:数组 对象 访问 循环      更新时间:2023-09-26

我想遍历一个对象数组,以便得到最年长的人和最年轻的人。我怎么能得到它?这看起来是一件容易的事,但我无法为每个循环提供简单的年龄。有什么想法吗?

var p = [
    { name : "Billy", age : 5 },
    { name : "Lucy", age : 31 },
    { name : "Jonny", age : 11 },
    { name : "Wolfgang", age : 78 },
    { name : "Robert", age : 23 }
];

我已经看到了这个,但它并没有帮助我理解这个问题。

Simple for loop

var high = 0,
    low;
//Start at 0 index, iterate until the array length, iterate by 1
for (var i = 0; i < p.length; i++) {
    //checking high
    if (p[i].age > high)
        high = p[i].age;
    //checking low
    if (p[i].age < low || low == null)
        low = p[i].age;
}

您可以使用 for in 循环来解决此问题。您唯一需要记住的是,循环只会为您提供索引。因此,您需要访问原始对象。

一个可能的解决方案是:

var maxPerson = p[0];
for(var i in p) {
    if (p[i].age > maxPerson.age)
        maxPerson = p[i];
}

要在 JavaScript 中迭代数组,请使用 .forEach .

p.forEach(function(person){
    console.log(person.name + ' is ' + person.age + ' years old.');
});

请注意,IE 8 及更低版本不支持.forEach。您可以使用 es5-shim 将该功能添加到旧浏览器中,或者如果您已经使用 jQuery,则可以使用每个 jQuery。

现在,为了获得最老和最年轻的,我们需要在循环列表(jsFiddle)时存储最佳选择:

var oldest = p[0];
var youngest = p[0];
p.forEach(function(person){
    if (oldest.age < person.age) { oldest = person; }
    if (person.age < youngest.age) { youngest = person; }
});

最后,oldestyoungest将包含相应的对象。

如果您只想检索两个对象,最旧的和最年轻的,那么最简单的方法是根据年龄按升序或降序对数组进行排序,然后获取结果数组的第一个和最后一个元素。

使用 sort (mdn doc) 将适用于每个浏览器:

p.sort(function (a, b) {
    return a.age - b.age;
});
var youngest = p[0];
var oldest = p[p.length - 1];

但是要小心,sort会修改原始数组。您可以克隆它以绕过此问题:

var clone = [].concat(p).sort(/* compare function */);
var youngest = clone[0];
var oldest = clone[clone.length - 1];