使用Set从数组中删除重复项,并保持最高ID

die*_*nez 0 javascript arrays typescript ecmascript-6 ionic-framework

我有这个数组:

array = [{id: 1, name: 'apple'}, {id: 2, name: 'banana'}, {id: 3, name: 
'apple'}]
Run Code Online (Sandbox Code Playgroud)

我需要删除具有重复属性“名称”的对象,并且需要为其余对象保留最高的ID,如下所示:

newarray = [ {id: 2, name: 'banana'}, {id: 3, name: apple}]
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这种方式:

array = [{id: 1, name: 'apple'}, {id: 2, name: 'banana'}, {id: 3, name: 
apple}]

newarray = Array.from(new Set(array.map(x => x.id)))
                 .map(id => {
                   return {
                     id: id,
                     name: array.find( s => s.id === id).name
})
Run Code Online (Sandbox Code Playgroud)

结果我得到

newarray = [ {id: 2, name: 'banana'}, {id: 1, name: apple}]
Run Code Online (Sandbox Code Playgroud)

我删除了重复的对象,但是我没有为每个剩余的对象获得最高的ID。

谢谢你给我一个主意。

Cer*_*nce 5

我会reduce改用-简化为按名称索引的对象,其值是关联的id/ name对象。如果对象已经存在给定名称,则仅当新对象的ID较高时才重新分配:

const array = [{id: 1, name: 'apple'}, {id: 2, name: 'banana'}, {id: 3, name: 
'apple'}];

const newArray = Object.values(
  array.reduce((a, item) => {
    const { name } = item;
    if (!a[name] || a[name].id < item.id) {
      a[name] = item;
    }
    return a;
  }, {})
);
console.log(newArray);
Run Code Online (Sandbox Code Playgroud)