如何根据对象值从数组中删除特定对象

时间:2018-07-20 09:30:25

标签: javascript jquery arrays

我在javascript中具有以下对象数组。

[{
     's': 'ETHBTC',
     'q': 123456
},
{
     's': 'XMLBTC',
     'q': 545454
},
{
     's': 'ETHBTC',
     'q': 123451
}]

我希望根据以下条件来删除重复的对象:如果所有对象都具有相同的键s值,我想保留唯一一个具有最高键q值的对象。在上面的示例中,我只想保留

[{
     's': 'ETHBTC',
     'q': 123456
},
{
     's': 'XMLBTC',
     'q': 545454
}]

因为它具有键{{1}的键q的最高值,而s : ETHBTC丢失了,所以我将其推入数组。最好的方法是什么?

1 个答案:

答案 0 :(得分:6)

我将reduce放入由s索引的对象中,检查该索引处的当前对象(如果有)是否具有较高的q或较低的Object.values,然后获取{ {1}}的结果将其转换回数组:

const input = [{
     's': 'ETHBTC',
     'q': 123456
},
{
     's': 'XMLBTC',
     'q': 545454
},
{
     's': 'ETHBTC',
     'q': 123451
}];
console.log(
  Object.values(
    input.reduce((a, item) => {
      const { s, q } = item;
      if (!a[s] || a[s].q < q) a[s] = item;
      return a;
    }, {})
  )
);

ES5兼容解决方案:

var input = [{
     's': 'ETHBTC',
     'q': 123456
},
{
     's': 'XMLBTC',
     'q': 545454
},
{
     's': 'ETHBTC',
     'q': 123451
}];

var outputObj = input.reduce(function (a, item) {
  var s = item.s,
      q = item.q;

  if (!a[s] || a[s].q < q) a[s] = item;
  return a;
}, {});
console.log(
  Object.keys(outputObj).map(key => outputObj[key])
);

相关问题