我有一个复杂的对象,其中需要添加一些对象数组(基于字段分组并添加)
两者的格式如下所示
//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.and
和obj
数组在一起。 减少
结果数组。- 使用每个
字段
作为键创建一个累加器。 - 如果该键已存在并且具有
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/