使用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!