我有一个对象数组:
const myArr = [
{ type: 'one', number: 1, fiedld: 'aaa' },
{ type: 'one', number: 2, field: 'bb' },
{ type: 'two', number: 2, field: 'xxx' },
{ type: 'two', number: 1, field: 'zz' },
{ type: 'two', number: 3, field: 'y' }
]
我想为每个number
获取最大值为type
的对象。
所以预期的结果是:
const newArr= [
{ type: 'one', number: 2, field: 'bb' },
{ type: 'two', number: 3, field: 'y' }
]
我目前的解决方案是:
sortByFields (field1, field2) {
return ((x, y) => {
return (
(x[field1] > y[field1]) - (y[field1] > x[field1])
|| (x[field2] > y[field2]) - (y[field2] > x[field2])
);
})
}
myArr.sort(this.sortByFields('type', 'number'));
let newArr = [];
for (let i = 0; i < myArr.length - 1; i++) {
if (myArr[i].type !== myArr[i + 1].type) {
newArr.push(myArr[i]);
}
if (i === myArr.length - 2) {
newArr.push(myArr[i + 1]);
}
}
我是JS的初学者,但我知道可以更恰当的方式完成。
答案 0 :(得分:2)
您可以使用reduce()
为每个类型创建一个带有键的对象,然后使用Object.values
来获取对象数组。
const myArr = [{ type: 'one', number: 1, fiedld: 'aaa' },{ type: 'one', number: 2, field: 'bb' },{ type: 'two', number: 2, field: 'xxx' }, { type: 'two', number: 1, field: 'zz' }, { type: 'two', number: 3, field: 'y' }]
var result = Object.values(myArr.reduce(function(r, e) {
if(!r[e.type]) r[e.type] = e;
else if(e.number > r[e.type].number) r[e.type] = e;
return r;
}, {}))
console.log(result)
答案 1 :(得分:0)
使用LoDash方法链接的解决方案(需要LoDash library):
const myArr = [{ type: 'one', number: 1, field: 'aaa' },
{ type: 'one', number: 2, field: 'bb' },
{ type: 'two', number: 2, field: 'xxx' },
{ type: 'two', number: 1, field: 'zz' },
{ type: 'two', number: 3, field: 'y' }
];
const result = _(myArr)
.groupBy('type')
.map(_.unary(_.partialRight(_.maxBy, 'number')))
.value()
console.log(result);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
答案 2 :(得分:0)
你使用哈希表的直接方法。
var array = [{ type: 'one', number: 1, fiedld: 'aaa' }, { type: 'one', number: 2, field: 'bb' }, { type: 'two', number: 2, field: 'xxx' }, { type: 'two', number: 1, field: 'zz' }, { type: 'two', number: 3, field: 'y' }],
indices = Object.create(null),
result = array.reduce(function (r, a) {
if (!(a.type in indices)) {
indices[a.type] = r.push(a) - 1;
return r;
}
if (a.number > r[indices[a.type]].number) {
r[indices[a.type]] = a;
}
return r;
}, []);
console.log(result)
&#13;