如何使用reduce合并JavaScript对象数组?

如何使用reduce合并JavaScript对象数组?,javascript,ecmascript-6,Javascript,Ecmascript 6,这里有很多关于合并javaScript数组对象的帖子,与我的问题相关,大多数都是合并2个数组,在我的情况下,这是不同的 我映射并过滤了API中的JSON,因为我只需要“标记” 这是我的密码: JSON.map((key) => (key.tags)) .filter(function (element) { return element !== undefined; }) 以下是我的结果: [  {  "web_devt": {  "item

这里有很多关于合并javaScript数组对象的帖子,与我的问题相关,大多数都是合并2个数组,在我的情况下,这是不同的

我映射并过滤了API中的JSON,因为我只需要“标记”

这是我的密码:

JSON.map((key) => (key.tags))
.filter(function (element) {
    return element !== undefined;
})
以下是我的结果:

   [ 
      { 
    "web_devt": { 
      "item_id": "858850847", 
      "tag": "web_devt" 
    } 
  }, 
  { 
    "web_devt": { 
      "item_id": "1004644524", 
      "tag": "web_devt" 
    } 
  }, 
  { 
    "pdo": { 
      "item_id": "1056300113", 
      "tag": "pdo" 
    }, 
    "php": { 
      "item_id": "1056300113", 
      "tag": "php" 
    }, 
    "web_devt": { 
      "item_id": "1056300113", 
      "tag": "web_devt" 
    } 
  }, 
  { 
    "parallax scrolling": { 
      "item_id": "1087678088", 
      "tag": "parallax scrolling" 
    } 
  }, 
  { 
    "react": { 
      "item_id": "2435593852", 
      "tag": "react" 
    } 
  }, 
  { 
    "javascript": { 
      "item_id": "2435595088", 
      "tag": "javascript" 
    } 
  }, 
  { 
    "react": { 
      "item_id": "2465629468", 
      "tag": "react" 
    } 
  } 
] 
我想这样合并它们:

[
{
"web_devt": [
    item_id: "765558416", 
        item_id: "765558416",
        item_id: "765558416",
        ...]
},
 {
"react": [
    item_id: "765558416",
    item_id: "765558416",
    item_id: "765558416",
    ...]
},
{
"JavaScipt": [
    item_id: "765558416",
    item_id: "765558416",
    item_id: "765558416",
    ...]
}
]

等等。。。 基本上所有相同的标签都会合并
如何在reduce或任何解决方案(但不包括loadash或任何第三方)中执行此操作?

假设内部数组将包含对象,请使用
。reduce
将输入对象分组到由
项id
索引的对象中,然后使用
对象将该对象转换为数组。条目

const输入=[ { 
“网络开发”:{ 
“项目id”:“858850847”,
“标签”:“网络开发” 
} 
},  
{ 
“网络开发”:{ 
“项目id”:“1004644524”,
“标签”:“网络开发” 
} 
},  
{ 
“pdo”:{ 
“项目id”:“105630113”,
“标记”:“pdo” 
},
 
“php”:{ 
“项目id”:“105630113”,
“标记”:“php” 
},
 
“网络开发”:{ 
“项目id”:“105630113”,
“标签”:“网络开发” 
} 
},  
{ 
“视差滚动”:{ 
“项目id”:“1087678088”,
“标记”:“视差滚动” 
} 
},  
{ 
“反应”:{ 
“项目id”:“2435593852”,
“标记”:“反应” 
} 
},  
{ 
“javascript”:{ 
“项目id”:“2435595088”,
“标记”:“javascript” 
} 
},  
{ 
“反应”:{ 
“项目id”:“2465629468”,
“标记”:“反应” 
} 
} 
];
const outputObj=输入.reduce((a,outerObj)=>{
Object.entries(outerObj.forEach)([key,{item_id}])=>{
如果(!a[key])a[key]=[];
[key].push({item_id});
});
返回a;
}, {});
const output=Object.entries(outputObj.map)([key,arr])=>({[key]:arr}));

控制台日志(输出)所需的输出语法无效。不能使用具有键的数组,也不能使用具有多个同名键的对象

但是,如果您想要一个ID数组,您可以使用reduce和group数据,对于单个项,可以使用reduce和group来获取对象中的键和值

var数据=[ 
{ 
“网络开发”:{ 
“项目id”:“858850847”, 
“标签”:“网络开发” 
} 
}, 
{ 
“网络开发”:{ 
“项目id”:“1004644524”, 
“标签”:“网络开发” 
} 
}, 
{ 
“pdo”:{ 
“项目id”:“105630113”, 
“标记”:“pdo” 
}, 
“php”:{ 
“项目id”:“105630113”, 
“标记”:“php” 
}, 
“网络开发”:{ 
“项目id”:“105630113”, 
“标签”:“网络开发” 
} 
}, 
{ 
“视差滚动”:{ 
“项目id”:“1087678088”, 
“标记”:“视差滚动” 
} 
}, 
{ 
“反应”:{ 
“项目id”:“2435593852”, 
“标记”:“反应” 
} 
}, 
{ 
“javascript”:{ 
“项目id”:“2435595088”, 
“标记”:“javascript” 
} 
}, 
{ 
“反应”:{ 
“项目id”:“2465629468”, 
“标记”:“反应” 
} 
} 
] 
const res=数据减少((附件,项目)=>{
Object.entries(item).forEach((attr)=>{
常量[键,值]=属性;
if(value.tag!==未定义){
if(附件[键]){
acc[key].push(value.item\u id);
}
否则{
acc[键]=[值.项目标识];
}
}
});
返回acc;
}, {})

控制台日志(res)
下面是我使用嵌套的
对象.values()
数组.forEach()使用
Array.reduce()
的尝试:

const输入=[ 
{ 
“网络开发”:{“项目id”:“858850847”, “标记”:“web_devt”} 
}, 
{ 
“网络开发”:{“项目id”:“1004644524”, “标记”:“web_devt”} 
}, 
{ 
“pdo”:{“item_id”:“105630113”,“tag”:“pdo”}, 
“php”:{“item_id”:“105630113”, “tag”:“php”}, 
“网络开发”:{“项目id”:“105630113”, “标记”:“web_devt”} 
}, 
{ 
“视差滚动”:{“item_id”:“1087678088”, “标记”:“视差滚动”} 
}, 
{ 
“反应”:{ “项目id”:“2435593852”,“标记”:“反应”} 
}, 
{ 
“javascript”:{“item_id”:“2435595088”, “标记”:“javascript”} 
}, 
{ 
“react”:{“item_id”:“2465629468”,“tag”:“react”} 
} 
];
让res=输入。减少((acc,obj)=>
{
Object.values(obj.forEach)({item_id,tag})=>
{
acc[tag]=acc[tag]|{[tag]:[]}
acc[标签][标签].推送(项目标识);
});
返回acc;
}, {});
console.log(Object.values(res))
.as控制台{背景色:黑色!重要;颜色:石灰;}

.作为控制台包装{max height:100%!important;top:0}
所需输出的语法无效。数组没有键值对,只有值。@Shidersz,您给出的第二个建议也是无效的,因为在一个数组中不能有多个同名的键object@ShubhamKhatri你是对的,我希望我仍然可以编辑我的评论,但是我将不得不删除…@Shidersz您可以删除并添加相关部分谢谢您对我问题的回答。我尝试过这个方法,效果很好。@GLEN87我很乐意提供帮助,请记住投票选出对您有帮助的答案,并接受其中一个答案。很抱歉我不知道,为什么要使用Object.entries而不是Object.values?这是因为Object.entries(obj)–返回一个[key,value]对数组。和Object.values(obj)–返回一个值数组,我们可以在这里返回键和值,对吗?当然,您可以使用其中任何一个,这取决于您。如果键名与
标记不同,并且您需要该标记,则使用
对象.values