繁体   English   中英

如果元素在另一个对象数组中,则删除包含对象数组内部数组的对象属性

[英]remove object property containing array inside array of objects if element in another array of objects

我正在处理大量对象。 我将数据结构简化为以下内容。 每个对象都有一个id ,每个id都有0到4个与之关联的数组。 数组名称是动态生成的,最多包含2个元素,并且根据其他要求可以是任意数量的名称。 我的初始对象如下所示:

const arr = [{id: "12345", array1: ["Banana", "Apple"], array2: ["Orange", "Strawberry"]}, 
             {id: "12345", array0: ["Potato", "Tomato"]},           
             {id: "54321", array0: ["Kiwi", "Apple"], array1: ["Potato", "Onion"]},
             {id: "54321", array2: ["Orange", "Tomato"], array0: ["Kiwi", "Banana"]},
             {id: "13579", array1: ["Banana", "Apple"], array2: ["Grapefruit", "Onion"]},
             {id: "13579", array1: ["Potato", "Banana"], array2: ["Orange", "Pepper"]}]

我有一个“查找”对象数组。 每个对象都有一个id和一个type

const lookup = [{id: "12345", type: "Banana"},
                {id: "12345", type: "Kiwi"},
                {id: "12345", type: "Apple"},
                {id: "54321", type: "Strawberry"} 
                {id: "54321", type: "Tomato"},
                {id: "54321", type: "Banana"},
                {id: "13579", type: "Tomato"},
                {id: "13579", type: "Grapefruit"}]

我需要对任何具有对应id's数组中任何type匹配ID使用“查找”对象。 我需要从对象中删除该属性。 查找应该是1:1,所以我得到的对象数组看起来像这样

const result = [{id: "12345", array2: ["Orange", "Strawberry"]}, 
                {id: "12345", array0: ["Potato", "Tomato"]},           
                {id: "54321", array0: ["Kiwi", "Apple"], array1: ["Potato", "Onion"]},
                {id: "54321"},
                {id: "13579", array1: ["Banana", "Apple"]},
                {id: "13579", array1: ["Potato", "Banana"], array2: ["Orange", "Pepper"]}]

我要挂断的部分是不提前知道对象键的名称,也不知道如何使用lookup对象的type属性在对象条目中搜索该键。 我最初的想法是使用Object.values但是如果使用该属性,我不确定如何删除对象属性。

对于lookup中的每个对象,请检查id是否与arr数组匹配。 如果匹配,则使用Object.keys从arr数组中的特定对象获取所有键。

伪码

  1. 如果id在两个数组中都匹配,则从arr数组中获取该对象。
  2. 使用Object.keys获取键数组例如,该数组现在是

    [ 'ID', 'ARRAY0', 'ARRAY1']

  3. 现在,迭代此数组,并&将该数组中的元素用作键名,并再次检查该值是否为数组。 例如

     `{id: "12345", array1: ["Banana", "Apple"], array2: ["Orange", "Strawberry"] }['array0']` 

    将产生["Banana", "Apple"] 在这种情况下,使用indexOf检查类型是否存在,如果不存在,则使用delete从对象中删除键和值

 const arr = [{ id: "12345", array1: ["Banana", "Apple"], array2: ["Orange", "Strawberry"] }, { id: "12345", array0: ["Potato", "Tomato"] }, { id: "54321", array0: ["Kiwi", "Apple"], array1: ["Potato", "Onion"] }, { id: "54321", array2: ["Orange", "Tomato"], array0: ["Kiwi", "Banana"] }, { id: "13579", array1: ["Banana", "Apple"], array2: ["Grapefruit", "Onion"] }, { id: "13579", array1: ["Potato", "Banana"], array2: ["Orange", "Pepper"] } ] const lookup = [{ id: "12345", type: "Banana" }, { id: "12345", type: "Kiwi" }, { id: "12345", type: "Apple" }, { id: "54321", type: "Strawberry" }, { id: "54321", type: "Tomato" }, { id: "54321", type: "Banana" }, { id: "13579", type: "Tomato" }, { id: "13579", type: "Grapefruit" } ] let newArray = []; lookup.forEach(function(item, index) { arr.forEach(function(arrId, index1) { if (item.id === arrId.id) { Object.keys(arrId).forEach(function(elem) { if (Array.isArray(arrId[elem]) && arrId[elem].indexOf(item.type) !== -1) { delete arr[index1][elem] } }) } }) }) console.log(arr) 

注意:在循环内更改数组不是一个好主意

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM