NodeJS / Javascript Поиск объектов с одинаковым свойством в разных массивах - PullRequest
0 голосов
/ 24 мая 2018

Я делаю некоторые вещи в NodeJS, и мне нужно сравнить объекты в разных массивах на наличие дублирующих свойств.

Пример:

Items = [{"id": "10", "name": "milk"},{"id":"7", "name": "banana"},{"id":"47", "name": "cheese"},{"id":"6", "name":"carrot"}]
Fridge = [{"id":"19", "name": "cheese"},{"id": "10", "name": "milk"},{"id":"43","name": "egg"}, {"id":"6", "name":"not a carrot"}]

Я хочу получить все объекты в массиве, которые имеютсвойства, которые включены в оба массива.(Нехорошее объяснение, см. Пример)

В этом примере я хочу получить

Output = [{"id": "10", "name": "milk"},{"id":"6", "name":"not a carrot"}]

, потому что только эти 2 идентификатора существуют в обоих входных массивах.

Как быя делаю это?

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Вы можете легко добиться этого, используя lodash.js, как показано ниже:

Если вы хотите проверить только идентификатор:

    let Items = [{"id": "10", "name": "milk"},{"id":"7", "name": "banana"},{"id":"47", "name": "cheese"},{"id":"6", "name":"carrot"}]
let Fridge = [{"id":"19", "name": "cheese"},{"id": "10", "name": "milk"},{"id":"43","name": "egg"}, {"id":"6", "name":"not a carrot"}]

let result = _.intersectionBy(Fridge, Items, 'id');

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

Или, если вы хотите сравнить весь объект:

let Items = [{"id": "10", "name": "milk"},{"id":"7", "name": "banana"},{"id":"47", "name": "cheese"},{"id":"6", "name":"carrot"}]
let Fridge = [{"id":"19", "name": "cheese"},{"id": "10", "name": "milk"},{"id":"43","name": "egg"}, {"id":"6", "name":"not a carrot"}]

let result = _.intersectionWith(Items, Fridge, _.isEqual);

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

`

0 голосов
/ 24 мая 2018

Еще один подход, который может быть полезен для поиска дубликатов с n массивами объектов в качестве входных данных:

var Items = [{"id": "10", "name": "milk"},{"id":"7", "name": "banana"},{"id":"47", "name": "cheese"},{"id":"6", "name":"carrot"}];
var Fridge = [{"id":"19", "name": "cheese"},{"id": "10", "name": "milk"},{"id":"43","name": "egg"}, {"id":"6", "name":"not a carrot"}];

var mergedArrray = Items.concat(Fridge); //merge all
//array1 = array1.concat(array2, array3, array4, ..., arrayN);    


var duplicateIds = [];
var uniqueIds = [];

//The idea is look for the id in uniqueIds, if exist push into duplicateIds
//if not push into uniqueIds 
mergedArrray.map((obj,v)=>{
(uniqueIds.indexOf(obj.id) == -1)?uniqueIds.push(obj.id):duplicateIds.push(obj.id);
})

console.log(duplicateIds);
console.log(uniqueIds);

Это решение не возвращает массив дубликатов, только ссылку.

0 голосов
/ 24 мая 2018

Вы можете использовать метод includes в сочетании с filter.

Items = [{"id": "10", "name": "milk"},{"id":"7", "name": "banana"},{"id":"47", "name": "cheese"},{"id":"6", "name":"carrot"}]
Fridge = [{"id":"19", "name": "cheese"},{"id": "10", "name": "milk"},{"id":"43","name": "egg"}, {"id":"6", "name":"not a carrot"}]

result = Fridge.filter(item => Items.map(f => f.id).includes(item.id));
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...