在javascript

时间:2016-05-06 15:45:38

标签: javascript arrays sorting object

我有一个对象数组,如。

[{
  id: 1,
  age: 23
}, {
  id: 1,
  age: 25
}, {
  id: 2,
  age: 230
}, {
  id: 2,
  age: 255
}, {
  id: 3,
  age: 232
}, {
  id: 1,
  age: 215
}]

我需要通过为每个id排序最高年龄来获得最终数组。所以最终阵列将是。

[{
    id: 1,
    age: 215
  }, {
    id: 2,
    age: 255
  }, {
    id: 3,
    age: 232
  }]

5 个答案:

答案 0 :(得分:1)

您可以构建一个散列,在该散列中存储具有每个id的最大年龄的对象。然后按数字对其键进行排序,并按顺序获取值。

var hash = array.reduce(function(hash, obj) {
  if(!hash[obj.id]) hash[obj.id] = obj;
  else if(hash[obj.id].age < obj.age) hash[obj.id] = obj;
  return hash;
}, Object.create(null));
Object.keys(hash).sort(function(a,b) {
  return a - b;
}).map(function(id) {
  return hash[id];
});

答案 1 :(得分:0)

这里有一个班轮

&#13;
&#13;
var arr = [{
  id: 1,
  age: 23,
}, {
  id: 1,
  age: 25,
}, {
  id: 2,
  age: 230,
}, {
  id: 2,
  age: 255,
}, {
  id: 3,
  age: 232,
}, {
  id: 1,
  age: 215,
}],
lut = {},
res = arr.sort((a,b) => b.age - a.age).filter(o => lut[o.id] ? false : lut[o.id] = true).sort((a,b) => a.id - b.id);

document.write("<pre>" + JSON.stringify(res,null,2) + "</pre>");
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您通常会将Activity1.onCreatefilter一起用于remove duplicate elements from an array。在数组元素是对象的情况下,您可以使用findIndex按某些给定的属性值搜索元素的索引。

indexOf

此外,您需要注意其浏览器支持。

答案 3 :(得分:0)

或以这种方式避免使用lodash的uniq()方法:

arr.sort(function(a,b){
  return b.id > a.id;
}).reverse();
var max = arr.length;
var i = 0;
while(i < max - 1){
  if (arr[i].id === arr[i+1].id) arr.splice(i+1,1);
  else i++
  max = arr.length;
}

答案 4 :(得分:0)

您可以使用vanillaJS进行排序。

function sortByAgeDesc(a,b) {return a.age > b.age ? -1 : a.age === b.age ? 0 : 1;}


output = input.sort(sortByAgeDesc);

现在问题是你只想要不同的ID。