У меня есть сложный объект, и на основе входного массива мне нужно изменить свойства внутри этого сложного объекта. Иллюстрация показана ниже. Мне нужно сгруппировать их на основе значений полей, а затем добавить их в массив объектов «или» (если значение поля совпадает). Если это не то же самое, добавьте его непосредственно в массив объектов «и». Нужно прочитать каждое поле из входного массива и проверить, присутствует ли оно внутри «фильтра» в «filterObj», и, если оно присутствует, добавить его в «и», иначе добавить в «или»

Формат обоих показан ниже

//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) ={amp}gt; { 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) ={amp}gt; { 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 {amp}amp;{amp}amp; 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) ={amp}gt; [...new Set([...acc, curr.field])], []); const updateItems = uniqKeys.map(obj ={amp}gt; { const filter_items = all_objs.filter(item ={amp}gt; item.field === obj); let resultObj = {}; if (filter_items {amp}amp;{amp}amp; filter_items.length {amp}gt; 1) { resultObj.or = [...filter_items]; } else if (filter_items {amp}amp;{amp}amp; filter_items.length == 1) { resultObj = { ...filter_items[0] }; } return resultObj; }) var result = {...filterObj, filter: { and: [...updateItems] }}; console.log(result); 

Пожалуйста, обратите внимание, что ваши входные данные имеют «fiedl2» и «field2» (два разных). Я обновил до того же имени поля в данных здесь