Фильтрация Лодаша / пересечение двух массивов объектов в Javascript - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть два массива объектов.Во втором массиве вы можете назначить идентификатор из первого массива.Как я могу отфильтровать первый массив, чтобы показать результаты, только если его идентификатор не был связан в array2?Я пробовал вложенный фильтр фильтра в lodash и фильтр поиска, но он просто не работает.

Вот что я пробовал:

array1.filter (item => item.id === find (array2, {relatedID: item.id}) [0] .associatedID)Вторая итерация поиска внутри фильтра.Я попробовал подобный подход фильтра вместо поиска, но это также не работало.Есть ли проблема с использованием item.id внутри функции find, как это предусмотрено параметром родительского фильтра?или нет?

Помощь?

const array1 = [{
  "id": "1",
  "name": "Test 1"
},
{
  "id": "2",
  "name": "Test 2",
}
{
  "id": "3",
  "name": "Test 3",
}
]

const array2 = [{
  "id": "12",
  "name": "Test 1",
  "associatedID": "1"
},
{
  "id": "22",
  "name": "Test 2",
  "associatedID": "2"
}
{
  "id": "32",
  "name": "Test 3",
}
]

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Используйте lodash's _.differenceWith(), чтобы получить все предметы из array, у которых нет associatedID в array2:

const array1 =[{"id":"1","name":"Test 1"},{"id":"2","name":"Test 2"},{"id":"3","name":"Test 3"}]

const array2 = [{"id":"12","name":"Test 1","associatedID":"1"},{"id":"22","name":"Test 2","associatedID":"2"},{"id":"32","name":"Test 3"}]

const result = _.differenceWith(array1, array2, 
  ({ id }, { associatedID }) => id === associatedID
);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 12 декабря 2018

Просто используйте Array.filter и Array.some, чтобы получить предметы из array1, не связанные с array2:

const array1 = [{ "id": "1", "name": "Test 1" }, { "id": "2", "name": "Test 2", }, { "id": "3", "name": "Test 3", } ]
const array2 = [{ "id": "12", "name": "Test 1", "associatedID": "1" }, { "id": "22", "name": "Test 2", "associatedID": "2" }, { "id": "32", "name": "Test 3", } ]

const result = array1.filter(x => !array2.some(y => y.associatedID == x.id))
console.log(result)

С помощью lodash это можно сделать также через _. Разность с :

const array1 = [{ "id": "1", "name": "Test 1" }, { "id": "2", "name": "Test 2", }, { "id": "3", "name": "Test 3", } ]
const array2 = [{ "id": "12", "name": "Test 1", "associatedID": "1" }, { "id": "22", "name": "Test 2", "associatedID": "2" }, { "id": "32", "name": "Test 3", } ]

const result = _.differenceWith(array1, array2, (x,y) => x.id === y.associatedID)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
0 голосов
/ 12 декабря 2018

Неэффективный подход будет выглядеть так:

array1.filter(elm1 => {
  return array2.find(elm2 => elm2.associatedID === elm1).length === 1
})

Если ваши массивы большие, вы можете отсортировать оба массива в соответствии с id и relatedID и запустить цикл for на обоих из них, чтобы каким-то образом вернуть результат

...