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

标签 javascript arrays ecmascript-6

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

两者的格式如下所示

//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/

相关文章:

javascript - 如何在 ES6 Map 中获得深度相等的键?替代使用复杂对象作为 ES6 映射键?

来自对象数组的 Javascript/Lodash 深度比较对象

.net - 如何创建 DateTime 的动态数组?

javascript - Angular JS 复选框不起作用

c++ - g++ 编译器是否以不同方式查看字符串数组和整数数组?

javascript - 如何动态检查一个字符串是否包含多个子字符串匹配?

javascript - 从 javascript 对象中递归添加和删除值

reactjs - 在没有 this 的 fetch Promise 中调用函数

javascript - 为什么我得到的闭包值为 "result"?

javascript - 输入框功能不起作用