如何使用reduce合并JavaScript对象数组?
这里有很多关于合并javaScript数组对象的帖子,与我的问题相关,大多数都是合并2个数组,在我的情况下,这是不同的 我映射并过滤了API中的JSON,因为我只需要“标记” 这是我的密码:如何使用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
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
。