簡體   English   中英

基於輸入數組操作復雜對象

[英]Manipulating a complex object based on an input array

我有一個復雜的對象,基於一個輸入數組,我需要修改這個復雜對象內部的屬性。 圖示如下。 我需要根據字段值對它們進行分組,然后將它們添加到對象的“或”數組中(如果字段值相同)。 如果不相同,則直接將其添加到對象的“and”數組中。 需要從輸入數組中讀取每個字段,並檢查它是否存在於“filterObj”的“filter”中,如果存在,則將其添加到“and”,否則將其添加到“or”

兩者的格式如下所示

//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" : "field2","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屬性。

 var 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" }], groups = obj.reduce( (r, o) => { if (r[o.field]) { if (!('or' in r[o.field])) r[o.field] = { or: [r[o.field]] }; r[o.field].or.push(o); } else { r[o.field] = o; } return r; }, (filterObj.filter.and || []).reduce((r, o) => { r['or' in o ? o.or[0].field : o.field] = o; return r; }, {})); filterObj.filter.and = Object.values(groups); console.log(filterObj);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

 //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": "field2", "value": "3" }, { "field": "field2", "value": "4" }, { "field": "field3", "value": "5" } ] //obj = [{ "field": "field1", "value": "2" }] let all_filters = []; if (filterObj.filter.and && filterObj.filter.and.hasOwnProperty('or')) { all_filters = [...filterObj.filter.and.or]; } else if (filterObj.filter.and) { all_filters = [...filterObj.filter.and]; } const all_objs = [...obj, ...all_filters]; // const all_objs = [...obj, ...filterObj.filter.and]; const uniqKeys = all_objs.reduce((acc, curr) => [...new Set([...acc, curr.field])], []); const updateItems = uniqKeys.map(obj => { const filter_items = all_objs.filter(item => item.field === obj); let resultObj = {}; if (filter_items && filter_items.length > 1) { resultObj.or = [...filter_items]; } else if (filter_items && filter_items.length == 1) { resultObj = { ...filter_items[0] }; } return resultObj; }) var result = {...filterObj, filter: { and: [...updateItems] }}; console.log(result);

請注意,您的輸入有“fiedl2”和“field2”(兩種不同)。 我在此處的數據中更新為相同的字段名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM