使用javascript将数组中的多个对象合并为一个基于一个键值对的对象
我有一个基于网格过滤值的动态生成的数组,如下所示使用javascript将数组中的多个对象合并为一个基于一个键值对的对象,javascript,arrays,Javascript,Arrays,我有一个基于网格过滤值的动态生成的数组,如下所示 [ { attributeId: 145, attributeName: "Status", filterOperator: "Is equal to", filterValue: "Active", SortBy: "" }, { attribut
[
{
attributeId: 145,
attributeName: "Status",
filterOperator: "Is equal to",
filterValue: "Active",
SortBy: ""
},
{
attributeId: 161,
attributeName: "Code",
filterOperator: "Contains",
filterValue: "22",
SortBy: ""
},
{
attributeId: 161,
attributeName: "Code",
filterOperator: "",
filterValue: "",
SortBy: "ASC"
}
]
这里,两个对象使用相同的“attributeId”生成,但一个对象具有SortBy详细信息,另一个对象具有筛选详细信息。现在我想把这两个对象合并成一个,这样它就会变成
{
attributeId: 161,
attributeName: "Code",
filterOperator: "Contains",
filterValue: "22",
SortBy: "ASC"
}
如果对象是理想的,我可以使用
this.columnList = Object.values(this.columnList.reduce((acc, cur) => Object.assign(acc, {
[cur.attributeName]: cur
}), {}));
这里,this.columnList是数组名。这里有什么建议吗。谢谢。您可以
减少数组,并根据属性ID对其进行分组。如果累加器中已经存在attributeId
,则循环遍历对象的条目,如果每个值不是空的,则更新每个值。如果属性ID
不存在,请将其添加到累加器中
const input=[{attributeId:145,attributeName:“Status”,filterOperator:“等于”,filterValue:“活动”,SortBy:”},{attributeId:161,attributeName:“code”,filterOperator:“Contains”,filterValue:“22”,SortBy:“},{attributeId:161,attributeName:“code”,filterOperator:“,filterValue:”,SortBy:“ASC”];
const merged=input.reduce((acc,o)=>{
常数{attributeId,…rest}=o;
如果(!acc[attributeId])
acc[attributeId]={…o}
其他的
{
Object.entries(rest.forEach)([k,v])=>{
如果(v)
acc[attributeId][k]=v
})
}
返回acc
}, {})
console.log(Object.values(merged))
您可以减少
数组,并根据属性ID对其进行分组。如果累加器中已经存在attributeId
,则循环遍历对象的条目,如果每个值不是空的,则更新每个值。如果属性ID
不存在,请将其添加到累加器中
const input=[{attributeId:145,attributeName:“Status”,filterOperator:“等于”,filterValue:“活动”,SortBy:”},{attributeId:161,attributeName:“code”,filterOperator:“Contains”,filterValue:“22”,SortBy:“},{attributeId:161,attributeName:“code”,filterOperator:“,filterValue:”,SortBy:“ASC”];
const merged=input.reduce((acc,o)=>{
常数{attributeId,…rest}=o;
如果(!acc[attributeId])
acc[attributeId]={…o}
其他的
{
Object.entries(rest.forEach)([k,v])=>{
如果(v)
acc[attributeId][k]=v
})
}
返回acc
}, {})
console.log(Object.values(merged))
我们可以将上述代码简化为:
var data=[{attributeId:145,attributeName:“状态”,filterOperator:“等于”,filterValue:“活动”,SortBy:”},{attributeId:161,attributeName:“代码”,filterOperator:“代码”,filterValue:“22”,SortBy:“},{attributeId:161,attributeName:“新代码”,filterOperator:“包含”,filterValue:“,SortBy:“ASC”];
让getResolvedData=(数组)=>{
返回Object.values(array.reduce((acc,{attributeId,…rest})=>{
acc[attributeId]=acc[attributeId]|{attributeId};
Object.entries(rest.forEach)([key,value])=>{
if(acc[attributeId][key]&值)acc[attributeId][key]=值
如果(!acc[attributeId][key])acc[attributeId][key]=值;
})
返回acc;
},{}));
}
log(getResolvedData(data))代码>我们可以将上述代码简化为:
var data=[{attributeId:145,attributeName:“状态”,filterOperator:“等于”,filterValue:“活动”,SortBy:”},{attributeId:161,attributeName:“代码”,filterOperator:“代码”,filterValue:“22”,SortBy:“},{attributeId:161,attributeName:“新代码”,filterOperator:“包含”,filterValue:“,SortBy:“ASC”];
让getResolvedData=(数组)=>{
返回Object.values(array.reduce((acc,{attributeId,…rest})=>{
acc[attributeId]=acc[attributeId]|{attributeId};
Object.entries(rest.forEach)([key,value])=>{
if(acc[attributeId][key]&值)acc[attributeId][key]=值
如果(!acc[attributeId][key])acc[attributeId][key]=值;
})
返回acc;
},{}));
}
log(getResolvedData(data))
Hi adiga,我们能否将其转换为一个以columnList数组为参数的方法,以便在多个位置使用它?@vamsi-sure。只需将其包装在一个函数中并返回arrayHi adiga,我们可以将其转换为以columnList数组为参数的方法,以便在多个位置使用它吗?@vamsi-sure。只需将其包装在函数中并返回数组即可将其作为方法生成?结果中缺少attributeId??嗨,如果值已经存在,那么如何使用新值更新它?目前,如果值存在,它将被忽略。@vamsi如果存在,是否必须用下一次迭代更新现有值?这是你想要的吗?这正是我需要的gorak!我们可以把它作为一个方法吗?结果中缺少attributeId??嗨,如果值已经存在,那么如何用新值更新它?目前,如果值存在,它将被忽略。@vamsi如果存在,是否必须用下一次迭代更新现有值?这是你想要的吗?这正是我需要的gorak!