我在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
丢失了,所以我将其推入数组。最好的方法是什么?
答案 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])
);