gpt4 book ai didi

javascript - 将对象数组分组并添加到复杂对象: Javascript

转载 作者:行者123 更新时间:2023-12-02 23:17:32 31 4
gpt4 key购买 nike

我有一个复杂的对象,其中需要添加一些对象数组(基于字段分组并添加)

两者的格式如下所示

//This is the source object where I need to add the below "arr" based on grouping

let filterObj = {
"feature": "test",
"filter": {
"and": [
{ "field": "field1","value": "1"}
]
}
};

//This array needs to be added to above object by grouping based on field
let obj = [
{"field": "field1","value": "2"},
{"field": "fiedl2","value": "3"},
{"field" : "field2","value": "4"},
{"field" : "field3","value" : "5"}
]

我希望输出采用以下格式:

var result = {
"feature": "test",
"filter": {
"and": [
{
"or" : [
{"field": "field1","value": "1"},
{"field": "field1", "value": "2"}
]
},
{
"or" : [
{"field": "field2","value": "3"},
{ "field": "field2","value": "4"},
]
},
{ "field": "field3", "value": "5"}
]
}
}

// The method that I have tried

filterObj.filter.and.or(...obj) ;// Does not work


我需要根据字段值对它们进行分组,然后将它们添加到对象的“或”数组中(如果字段值相同)。如果没有直接将其添加到“and”对象数组中。

如果有帮助,我们将不胜感激。

最佳答案

  • concat filter.andobj 数组在一起。
  • 减少结果数组。
  • 使用每个字段作为键创建一个累加器。
  • 如果该键已存在并且具有 or 属性,则将当前对象添加到 or 数组中。
  • 如果键存在但没有 or 属性,则使用累加器中的现有对象和正在迭代的当前对象创建一个数组。
  • 如果该键不存在,则添加该键并将其设置为当前对象。
  • 然后使用 Object.values()在结果对象上获取 and 数组。

let filterObj={feature:"test",filter:{and:[{field:"field1",value:"1"}]}},
obj=[{field:"field1",value:"2"},{field:"field2",value:"3"},{field:"field2",value:"4"},{field:"field3",value:"5"}];

const merged = obj.concat(filterObj.filter.and || []).reduce((r, o) => {
if(r[o.field] && r[o.field].or)
r[o.field].or.push(o);
else if(r[o.field])
r[o.field] = { or: [r[o.field], o] }
else
r[o.field] = o;
return r;
}, {})

const filter = { and: Object.values(merged) },
{ feature } = filterObj;

console.log({ feature, filter })
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 将对象数组分组并添加到复杂对象: Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57106678/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com