在对象数组中查找具有“id”属性的最大值的对象

时间:2014-03-28 12:20:03

标签: javascript jquery arrays object

在我的对象数组中,我想找到id属性值最高的对象。

这是我的阵列:

myArray = [
  {
    'id': '73',
    'foo': 'bar'
  },
  {
    'id': '45',
    'foo': 'bar'
  },
  // …
];

通常我使用$.grep来查找数组中的值,如下所示:

var result = $.grep(myArray, function(e){
    return e.id == 73;
  });

但在这种情况下,我需要为我想要选择的对象提供一个特定的id值。

8 个答案:

答案 0 :(得分:9)

使用数组的map()方法。使用map,您可以提供迭代数组中每个元素的函数。在该函数中,您可以计算出具有最高id的对象。例如:

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];

var maxid = 0;

myArray.map(function(obj){     
    if (obj.id > maxid) maxid = obj.id;    
});

这将为您提供数组中对象的最大ID。

然后你可以用grep来获取相关的对象:

var maxObj = $.grep(myArray, function(e){ return e.id == maxid; });

或者,如果您只想要具有最大ID的对象,则可以执行以下操作:

var maxid = 0;
var maxobj;

myArray.map(function(obj){     
    if (obj.id > maxid) maxobj = obj;    
});

//maxobj stores the object with the max id.

答案 1 :(得分:8)

问题是他想要找到ID最大的对象,而不仅仅是最大的id ...

var myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];

var max = myArray.reduce(function(prev, current) {
    if (+current.id > +prev.id) {
        return current;
    } else {
        return prev;
    }
});

// max == {'id':'73','foo':'bar'}

答案 2 :(得分:6)

const students = [
  { id: 100, name: 'Abolfazl', family: 'Roshanzamir' },
  { id: 2, name: 'Andy', family: 'Madadian' },
  { id: 1500, name: 'Kouros', family: 'Shahmir' }
]

如果要查找具有最大ID的对象

const item = students.reduce((prev, current) => (+prev.id > +current.id) ? prev : current)
 // it returns  { id: 1500, name: 'Kouros', family: 'Shahmir' }

如果要查找带有最小ID的对象

const item = students.reduce((prev, current) => (+prev.id < +current.id) ? prev : current)
// it returns {id: 2, name: "Andy", family: "Madadian"}

如果您想找到最大ID

const max = Math.max.apply(null, students.map(item => item.id));
// it returns 1500

如果要查找最小ID

const min = Math.min.apply(null, students.map(item => item.id));
// it returns 2 

答案 3 :(得分:2)

var max = 0;
var myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}]
var maxEle = myArray.map(function(ele){ if(ele.id>max){ max=ele} });

map是一个迭代数组元素并执行特定操作的函数。

答案 4 :(得分:0)

function reduceBy(reducer, acc) {
    return function(by, arr) {
        return arr[arr.reduce(function(acc, v, i) {
            var b = by(v);
            return reducer(acc[0], b) ? [b, i] : acc;
        }, acc || [by(arr[0]), 0])[1]];
    };
}
var maximumBy = reduceBy(function(a,b){return a<b;});


var myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
console.log(maximumBy(function(x){
    return parseInt(x.id,10)
}, myArray)); // {'id':'73','foo':'bar'}

答案 5 :(得分:0)

假设ID已被&#34;字符串化&#34;数字并通过仅使用地图实现这一目标:

let arr = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}],
    maxIndex = -1,
    maxId;

arr.map(function(obj, i){  
    if(maxIndex === -1){
     maxIndex = i;
     maxId = Number(obj.id);
    } else {
     if (Number(obj.id) > maxId){
      maxId = Number(obj.id);
      maxIndex = i; 
     }
    }
});

if(maxIndex !== -1) console.log(`Selected object: ${JSON.stringify(arr[maxIndex])}`)
else console.warn('No max ID. No ID\'s at all');

答案 6 :(得分:0)

let id = items.reduce((maxId, item) => Math.max(maxId, item.id), 0);

let id = Math.max(...items.map(item => item.id).concat(0)); // concat(0) for empty array
// slimmer and sleeker ;)
let id = Math.max(...items.map(item => item.id), 0);

这种方法更实用,因为在空数组的情况下,它返回0,这与

Math.max.apply(null, [].map(item => item.id)) // -Infinity

如果要获得“自动增量”,则无论数组是否为空,都可以加1。

// starts at 1 if our array is empty
autoincrement = items.reduce((maxId, item) => Math.max(maxId, item.id), 0) + 1;

UPD :带有地图的代码更短,但具有 reduce 更快,这在大型数组中感觉到

let items = Array(100000).fill()
   .map((el, _, arr) => ({id: ~~(Math.random() * arr.length), name: 'Summer'}));
const n = 100;

console.time('reduce test');
for (let i = 1; i < n; ++i) {
    let id = items.reduce((maxId, item) => Math.max(maxId, item.id), 0);
}
console.timeEnd('reduce test');

console.time('map test');
for (let i = 1; i < n; ++i) {
    let id = Math.max(items.map(item => item.id).concat(0));
}
console.timeEnd('map test');

console.time('map spread test');
for (let i = 1; i < n; ++i) {
    let id = Math.max(...items.map(item => item.id), 0);
}
console.timeEnd('map spread test');

减少测试:163.373046875ms
地图测试:1282.745849609375ms
地图传播测试:242.4111328125ms

如果我们创建更大的数组,则传播图将关闭

let items = Array(200000).fill()
    .map((el, _, arr) => ({id: ~~(Math.random() * arr.length), name: 'Summer'}));

减少测试:312.43896484375ms
地图测试:2941.87109375ms
未捕获的RangeError:超出最大调用堆栈大小 在:15:32

答案 7 :(得分:0)

使用 reduce()

的缩短版本
myArray.reduce((max, cur)=>(max.likes>cur.likes?max:cur))