Вы конвертируете 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>