Javascript 从阵列中删除重复对象,但合并嵌套对象

Javascript 从阵列中删除重复对象,但合并嵌套对象,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,当前有一个包含游戏版本的对象数组。但是,游戏发布可以在多个平台上进行,这些平台在阵列中显示为单独的对象。我希望通过比较游戏id删除重复的游戏,但合并平台对象 我尝试过使用reduce函数,它成功地按游戏id删除了重复的对象,但我无法将其应用于合并平台 const filteredArr = data.reduce((acc, current) => { const x = acc.find(item => item.game.id === current.game.id);

当前有一个包含游戏版本的对象数组。但是,游戏发布可以在多个平台上进行,这些平台在阵列中显示为单独的对象。我希望通过比较游戏id删除重复的游戏,但合并平台对象

我尝试过使用reduce函数,它成功地按游戏id删除了重复的对象,但我无法将其应用于合并平台

const filteredArr = data.reduce((acc, current) => {
  const x = acc.find(item => item.game.id === current.game.id);

  if (!x) {
    return acc.concat([current]);
  } else {
    return acc;
  }
}, []);
当前阵列:

const data = [{
  "id": 157283,
  "date": 1553212800,
  "game": {
    "id": 76882,
    "name": "Sekiro: Shadows Die Twice",
    "popularity": 41.39190295640344
  },
  "human": "2019-Mar-22",
  "m": 3,
  "platform": {"id": 48, "name": "PlayStation 4"},
  "region": 8,
  "y": 2019
}, {
  "id": 12,
  "date": 1553212800,
  "game": {
    "id": 76832,
    "name": "Spiderman",
    "popularity": 41.39190295640344
  },
  "human": "2019-Mar-22",
  "m": 3,
  "platform": {"id": 6, "name": "PC (Microsoft Windows)"},
  "region": 8,
  "y": 2019
}, {
  "id": 157283,
  "date": 1553212800,
  "game": {
    "id": 76882,
    "name": "Sekiro: Shadows Die Twice",
    "popularity": 41.39190295640344
  },
  "human": "2019-Mar-22",
  "m": 3,
  "platform": {"id": 48, "name": "Xbox"},
  "region": 8,
  "y": 2019
}]
合并后的预期格式:

[{
  "id": 157283,
  "date": 1553212800,
  "game": {
    "id": 76882,
    "name": "Sekiro: Shadows Die Twice",
    "popularity": 41.39190295640344
  },
  "human": "2019-Mar-22",
  "m": 3,
  "platforms": ["PlayStation", "Xbox"],
  "region": 8,
  "y": 2019
}, {
  "id": 12,
  "date": 1553212800,
  "game": {
    "id": 76832,
    "name": "Spiderman",
    "popularity": 41.39190295640344
  },
  "human": "2019-Mar-22",
  "m": 3,
  "platforms": ["Playstation"],
  "region": 8,
  "y": 2019
}]

你真的很接近,你只需要改变一下逻辑。您可以尝试以下方法:;例如——

返回值为

[
  {
    "id": 157283,
    "date": 1553212800,
    "game": {
      "id": 76882,
      "name": "Sekiro: Shadows Die Twice",
      "popularity": 41.39190295640344
    },
    "human": "2019-Mar-22",
    "m": 3,
    "platform": [
      {
        "id": 48,
        "name": "PlayStation 4"
      },
      {
        "id": 48,
        "name": "Xbox"
      }
    ],
    "region": 8,
    "y": 2019
  },
  {
    "id": 12,
    "date": 1553212800,
    "game": {
      "id": 76832,
      "name": "Spiderman",
      "popularity": 41.39190295640344
    },
    "human": "2019-Mar-22",
    "m": 3,
    "platform": [
      {
        "id": 6,
        "name": "PC (Microsoft Windows)"
      }
    ],
    "region": 8,
    "y": 2019
  }
]
[
  {
    "id": 157283,
    "date": 1553212800,
    "game": {
      "id": 76882,
      "name": "Sekiro: Shadows Die Twice",
      "popularity": 41.39190295640344
    },
    "human": "2019-Mar-22",
    "m": 3,
    "platform": [
      "PlayStation 4",
      "Xbox"
    ],
    "region": 8,
    "y": 2019
  },
  {
    "id": 12,
    "date": 1553212800,
    "game": {
      "id": 76832,
      "name": "Spiderman",
      "popularity": 41.39190295640344
    },
    "human": "2019-Mar-22",
    "m": 3,
    "platform": [
      "PC (Microsoft Windows)"
    ],
    "region": 8,
    "y": 2019
  }
]
如果您只想拥有一个平台字符串数组,请使用

const filteredArr = data.reduce((acc, current) => {
  const x = acc.find(item => item.game.id === current.game.id);

  if (!x) {
    current.platform = [current.platform.name]
    acc.push(current);
  } else {
    x.platform.push(current.platform.name);
  }

  return acc;
}, []);
现在返回值是

[
  {
    "id": 157283,
    "date": 1553212800,
    "game": {
      "id": 76882,
      "name": "Sekiro: Shadows Die Twice",
      "popularity": 41.39190295640344
    },
    "human": "2019-Mar-22",
    "m": 3,
    "platform": [
      {
        "id": 48,
        "name": "PlayStation 4"
      },
      {
        "id": 48,
        "name": "Xbox"
      }
    ],
    "region": 8,
    "y": 2019
  },
  {
    "id": 12,
    "date": 1553212800,
    "game": {
      "id": 76832,
      "name": "Spiderman",
      "popularity": 41.39190295640344
    },
    "human": "2019-Mar-22",
    "m": 3,
    "platform": [
      {
        "id": 6,
        "name": "PC (Microsoft Windows)"
      }
    ],
    "region": 8,
    "y": 2019
  }
]
[
  {
    "id": 157283,
    "date": 1553212800,
    "game": {
      "id": 76882,
      "name": "Sekiro: Shadows Die Twice",
      "popularity": 41.39190295640344
    },
    "human": "2019-Mar-22",
    "m": 3,
    "platform": [
      "PlayStation 4",
      "Xbox"
    ],
    "region": 8,
    "y": 2019
  },
  {
    "id": 12,
    "date": 1553212800,
    "game": {
      "id": 76832,
      "name": "Spiderman",
      "popularity": 41.39190295640344
    },
    "human": "2019-Mar-22",
    "m": 3,
    "platform": [
      "PC (Microsoft Windows)"
    ],
    "region": 8,
    "y": 2019
  }
]

您可以分离对象的
platform
,查看是否有具有相同
id
的对象,并将platform添加到数组中,而不是创建新的数据集

const
数据=[{id:157283,日期:1553212800,游戏:{id:76882,名称:“阴影死亡两次”,流行度:41.39190295640344},人类:“2019-Mar-22”,m:3,平台:{id:48,名称:“PlayStation 4”},地区:8,y:2019},{id:12,日期:1553212800,游戏:{id:76832,名称:“蜘蛛侠”,流行度:41.39190640344},人类:“2019-Mar-22”,m:3,平台:{id:6,名称:“PC(Microsoft Windows)”},地区:8,y:2019},{id:157283,日期:1553212800,游戏:{id:76882,名称:“Sekiro:阴影死亡两次”,人气:41.39190295640344},人类:“2019-3-22”,m:3,平台:{id:48,名称:“Xbox”},地区:8,y:2019},
结果=数据.reduce((r,{platform,…o})=>{
var temp=r.find(({id})=>id==o.id);
if(!temp)r.push(temp={…o,platforms:[]});
平台推送温度(平台);
返回r;
}, []);
控制台日志(结果)
.as控制台包装{最大高度:100%!重要;顶部:0;}
请查看:

const data=[{“id”:157283,
“日期”:1553212800,
“游戏”:{
“id”:76882,
“名字”:“塞基罗:影子死两次”,
“受欢迎程度”:41.39190295640344
},
“人类”:“2019-3-22”,
“m”:3,
“平台”:{
“id”:48,
“名称”:“PlayStation 4”
},
“区域”:8,
“y”:2019年
},
{
“id”:12,
“日期”:1553212800,
“游戏”:{
“id”:76832,
“名字”:“蜘蛛侠”,
“受欢迎程度”:41.39190295640344
},
“人类”:“2019-3-22”,
“m”:3,
“平台”:{
“id”:6,
“名称”:“电脑(Microsoft Windows)”
},
“区域”:8,
“y”:2019年
},{“id”:157283,
“日期”:1553212800,
“游戏”:{
“id”:76882,
“名字”:“塞基罗:影子死两次”,
“受欢迎程度”:41.39190295640344
},
“人类”:“2019-3-22”,
“m”:3,
“平台”:{
“id”:48,
“名称”:“Xbox”
},
“区域”:8,
“y”:2019年
},
]
const filteredar=数据减少((acc,当前)=>{
const x=acc.find(item=>item.game.id==current.game.id);
如果(!x){
current.platform=[current.platform.name]
返回acc.concat([当前]);
}否则{
x、 platform.push(当前.平台.名称);
返回acc;
}
}, []);

控制台日志(Filteredar)
这里是另一个解决方案,使用
forEach
而不是
reduce
。这利用了一个查找散列,该散列可以更快地查找大量数据,然后使用
find

const data=[{“id”:157283,“date”:1553212800,“game”:{“id”:76882,“name”:“Sekiro:影子死两次”,“popularity”:41.39190295640344},“human”:“2019-Mar-22”,“m”:3,“PlayStation”:{“id”:48,“name”:“PlayStation 4”},“region”:8,“y”:2019},{“id”:12,“date”:1553212800,“game”:{“id”:76832,“name”:“Spiderman”,“popularity”:41.39190295640344},“人类”:“2019-Mar-22”,“m”:3,“平台”:{“id”:6,“名称”:“PC(Microsoft Windows)”},“地区”:8,“y”:2019},“id”:157283,“日期”:1553212800,“游戏”:{“id”:76882,“名称”:“Sekiro:阴影死亡两次”,“人气”:41.39190295640344},“人类”:“2019-Mar-22”,“m”:3,“平台”:{“id”:48,“名称”:“Xbox”},“地区”:8,“y”:2019}];
让结果={};
data.forEach(({platform,…release})=>{
release.platforms=[platform.name];
const releaseLookup=结果[release.game.id];
如果(!releaseLookup){
结果[release.game.id]=发布;
}否则{
releaseLookup.platforms.push(…release.platforms);
}
});

console.log(Object.values(result));
如果不同平台的发布日期不同,该怎么办?在这种情况下,“Sekiro:Shadows Die Twow”会同时在多个平台上发布游戏。但对于某些平台,稍后发布游戏并不少见。例如“暗黑破坏神3”“,2012年在Windows和OS X上发布,2013年在PS3上发布,2014年在PS4上发布,2018年在Switch上发布。很好的一点,我认为一个简单的操作人员可以修复这个用例<代码>常量x=acc.find(item=>item.game.id===current.game.id&&item.releaseDate==current.releaseDate)