Loda sh Разница по удалению только один раз - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь получить разницу массива объектов на основе определенного ключа.

Пример, если я хочу удалить первый объект на основе ключа 'b'

const arrayA = [
    {
    a:1,
    b:2
   },
   {
    a:1,
    b:2
   },
   {
     a:11111,
     b:22222,
   }
  ]

  const arrayB = [
    {
    a:"does not matter",
    b:2
   },
   {
     a:"does not matter",
     b:22222,
   }
  ]

Я хочу, чтобы результат был [{a: 1, b: 2}]

Использование loda sh Разница, кажется, удаляет все вхождения, а не только один раз.

1 Ответ

1 голос
/ 04 февраля 2020

Вы конвертируете arrayB в набор значений свойства b. Затем отфильтруйте arrayA и попробуйте удалить значение b каждого элемента из набора. Если удаление прошло успешно (b есть в наборе), элемент будет удален, а значение b будет удалено и из набора.

const arrayA = [{"a":1,"b":2},{"a":1,"b":2},{"a":11111,"b":22222}]

const arrayB = [{"a":"does not matter","b":2},{"a":"does not matter","b":22222}]

const bValues = new Set(arrayB.map(o => o.b))
const result = arrayA.filter(o => !bValues.delete(o.b))

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

Если arrayB может содержать несколько объектов с одинаковым значением b, и вы хотите удалить точное количество объектов (и не только 1 ) из arrayA, вы можете использовать карту вместо. Карта должна содержать счетчик для каждого значения b в arrayB. Затем фильтруйте arrayA и уменьшайте счетчик всякий раз, когда найдено значение b. Если счетчик 0 или не был найден, сохраните предмет.

const arrayA = [{"a":1,"b":2},{"a":1,"b":2},{"a":1,"b":2},{"a":11111,"b":22222}] // 3 x b: 2

const arrayB = [{"a":"","b":2},{"a":"","b":2},{"a":"does not matter","b":22222}] // 2 x b: 2

const bValues = arrayA.reduce((r, o) => r.set(o.b, (r.has(o.b) || 0) + 1), new Map)


const result = arrayA.filter(o => {
  const v = bValues.get(o.b) || 0 // get the current counter of b
  
  if(v === 0) return true // if it's 0 don't remove the item
  
  bValues.set(o.b, v - 1) // decrement the counter
})

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
...