удалить свойство объекта, содержащее массив внутри массива объектов, если элемент в другом массиве объектов - PullRequest
0 голосов
/ 30 августа 2018

Я работаю с большим массивом объектов. Я упростил мою структуру данных следующим образом. Каждый объект имеет 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"}]

Мне нужно использовать объект «поиск» для любого соответствующего идентификатора, который имеет type в любом из соответствующих массивов id's. Мне нужно удалить это свойство из объекта. Поиски должны быть 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. Сначала я хотел использовать Object.values, но тогда я не уверен, как удалить свойство объекта, если я его использую.

1 Ответ

0 голосов
/ 30 августа 2018

Для каждого объекта в lookup проверьте, совпадает ли идентификатор в массиве arr. Если совпадения, то получить все ключи от этого конкретного объекта в массиве arr, используя Object.keys.

псевдокод

  1. Если идентификатор совпадает в обоих массивах, тогда взять этот объект из массива 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)

Примечание: отключение массива внутри цикла не очень хорошая идея

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...