Javascript 如何获取最大值为';编号';对于每个不同的';类型';从对象数组?

Javascript 如何获取最大值为';编号';对于每个不同的';类型';从对象数组?,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个对象数组: 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

我有一个对象数组:

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
的对象。 因此,预期结果是:

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]);
    }
}
sortByFields(字段1、字段2){
返回((x,y)=>{
返回(
(x[field1]>y[field1])-(y[field1]>x[field1])
||(x[field2]>y[field2])-(y[field2]>x[field2])
);
})
}
myArr.sort(this.sortByFields('type','number');
设newArr=[];
for(设i=0;i
我是JS的初学者,但我知道可以用更合适的方法来完成。

您可以使用
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)函数(r,e){
如果(!r[e.type])r[e.type]=e;
如果(e.number>r[e.type].number)r[e.type]=e;
返回r;
}, {}))

console.log(结果)
具有LoDash方法链接的解决方案(需要):
const myArr=[{type:'one',number:1,field:'aaa'},
{类型:'1',编号:2,字段:'bb'},
{类型:'two',编号:2,字段:'xxx'},
{类型:'two',编号:1,字段:'zz'},
{类型:'two',编号:3,字段:'y'}
];
常量结果=uuz(myArr)
.groupBy('type'))
.map(u.unary(u.partiOkable(u.maxBy,'number'))
.value()
控制台日志(结果)

您可以对哈希表使用直接的方法

var数组=[{type:'one',number:1,fiedld:'aaa'},{type:'one',number:2,field:'bb'},{type:'two',number:2,field:'xxx'},{type:'two',number:3,field:'y'},],
索引=Object.create(null),
结果=数组.reduce(函数(r,a){
如果(!(a.输入索引)){
指数[a.type]=r.push(a)-1;
返回r;
}
如果(a.number>r[索引[a.type]].number){
r[指数[a.类型]]=a;
}
返回r;
}, []);

console.log(result)
非常感谢,对我来说效果很好。但如果你不介意的话,我有两个问题:1。reduce的2个参数是什么意思(那个花括号)?2.这是否适用于ES6?回调函数之后的第二个参数只是空对象,您将其作为初始值传递以减少。这里没有太多的ES6,除了Object.values,它甚至可能是ES7,所以这个空对象是回调函数中的
r
。我理解正确了吗?@Yura是的,没错。这就是累加器,将空对象作为其起始值或初始值传递。