代码之家  ›  专栏  ›  技术社区  ›  kemotoe

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

  •  0
  • kemotoe  · 技术社区  · 8 年前

    我正在处理大量的对象。我已将我的数据结构简化为以下内容。每个对象都有一个 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"]}]
    

    身份证件 和一个 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

    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 对象的类型属性。我最初的想法是 Object.values

    1 回复  |  直到 8 年前
        1
  •  1
  •   brk    8 年前

    lookup 检查id是否与中的匹配 arr 数组。如果匹配,则从中获取该特定对象的所有键 阿里尔 数组使用对象.键.

    1. 如果两个数组中的id都匹配,则从 阿里尔 数组。
    2. ['id'、'array0'、'array1']

    3. 现在迭代此数组并使用此数组中的元素作为键名 &再次检查值是否为数组(amp;C)。

      `{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)

    注意:在循环中改变数组不是一个好主意