Как добраться до пересечения с Лодашем? - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь вернуть соответствующие идентификаторы в этом массиве объектов:

const arr = [{id:1,name:'Harry'},{id:2,name:'Bert'}]
const arr2 =["1"]

Как я могу вернуть только идентификатор со значением 1 в arr?

1 Ответ

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

Lodash

Вероятно, наиболее кратким рабочим решением будет использование lodash _.intersectionBy, но для этого потребуется, чтобы ваш массив arr2 содержал объект с id:

const arr = [{id:1,name:'Harry'},{id:2,name:'Bert'}]
const arr2 =[{id:1}]  // <-- object with the `id`

const result = _.intersectionBy(arr, arr2, 'id');

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

Другой способ сделать это с помощью lodash будет через _.intersectionWith, который не требует каких-либо изменений на ваших заданных входах:

const arr = [{id:1,name:'Harry'},{id:2,name:'Bert'}]
const arr2 =["1"]

const result = _.intersectionWith(arr, arr2, (o,num) => o.id == num);

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

Идея состоит в том, чтобы предоставить ему пользовательскую функцию, позволяющую узнать, как сравнивать значения между двумя массивами.

ES6 и простой Javascript

Вы можете сделать это с JS только через Array.find, если вы ищете только один элемент:

const arr = [{id:1,name:'Harry'},{id:2,name:'Bert'}]
const arr2 =["1"]

const result = arr.find(x => arr2.some(y => x.id == y))
console.log(result)

Вы можете использовать Array.filter, если у вас больше идентификаторов в arr2:

const arr = [{id:1,name:'Harry'},{id:2,name:'Bert'}]
const arr2 =["1", "2"]

const result = arr.filter(x => arr2.some(y => x.id == y))
console.log(result)

Поскольку у вас есть идентификаторы в arr, вы также можете просто использовать Array.map:

const arr = [{id:1,name:'Harry'},{id:2,name:'Bert'}]
const arr2 =["1"]

const result = arr2.map(x => arr.find(y => y.id == x))
console.log(result)

Другой вариант, указанный @ibrahim mahrir, будет через Array.find & Array.includes:

const arr = [{id:1,name:'Harry'},{id:2,name:'Bert'}]
const arr2 =["1"]

const result = arr.filter(x => arr2.includes(x.id.toString()))
console.log(result)
...