Javascript 从阵列中删除重复对象,但合并嵌套对象
当前有一个包含游戏版本的对象数组。但是,游戏发布可以在多个平台上进行,这些平台在阵列中显示为单独的对象。我希望通过比较游戏id删除重复的游戏,但合并平台对象 我尝试过使用reduce函数,它成功地按游戏id删除了重复的对象,但我无法将其应用于合并平台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);
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)代码>