Как найти в двух массивах объектов одинаковые значения?

Есть 2 массива объектов, например:

[{"id":1, "item":  213}]

[{"id":1, "item":  213}, {"id":78, "item":  21}, {"id":19, "item":  13}]

Как проверить, если ли какой-нибудь объект в другом массиве объектов? В данном случае должен найтись один.
  • Вопрос задан
  • 11292 просмотра
Решения вопроса 2
Ivanq
@Ivanq
Знаю php, js, html, css
var a = [{"id":1, "item": 213}];
var b = [{"id":1, "item":  213}, {"id":78, "item":  21}, {"id":19, "item":  13}];

var result = a.filter(function(v) {
    return b.some(function(v2) {
        return v.id == v2.id && v.item == v2.item;
    }
});
console.log(result);

Типа того. Если нужна большая совместимость со старыми версиями, скажите, перепишу.
Ответ написан
Immortal_pony
@Immortal_pony Куратор тега JavaScript
function findEqualObjects(someArray, otherArray) {
    var equalObjects = [];
  
    someArray.forEach(function(elementOfSomeArray) { 
        otherArray.forEach(function(elementOfOrherArray){
            if (JSON.stringify(elementOfSomeArray) === JSON.stringify(elementOfOrherArray)) {
                equalObjects.push(elementOfOrherArray);
            }
        });
    });
  
    return equalObjects;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Для двух массивов строк или чисел алгоритм был бы такой:
  1. отсортировать оба по возрастанию;
  2. взять нулевые элементы и сравнить, кто больше;
  3. брать следующее значение из того массива, где было мЕньшее;
  4. так двигаться до конца одного из массивов или первого найденного равенства.


Можно применить алгоритм, зная особенности именно этой задачи. Известно, что полей два, называются id и item, значения у них целые. Сделаем из каждого массив псевдо-хэшей, чтобы вместо массива объектов иметь дело с массивом строк.

function haveCommon(a,b) {
    var phash = function(e){ return '' + e.id + '.' + e.item }
       ,ha = a.map(phash).sort()
       ,hb = b.map(phash).sort()
       ,ia = 0
       ,ib = 0
    ;
    while( ia<ha.length  &&  ib<hb.length) {
        if( ha[ia] > hb[ib]) ib++;
        else if( ha[ia] < hb[ib]) ia++;
        else return true;
    }
    return false;
}

haveCommon( [{"id":1, "item": 213}]
    ,[{"id":1, "item":  213}, {"id":78, "item":  21}, {"id":19, "item":  13}]
) // true
Ответ написан
Комментировать
@Tsimur_S
или просто подключить lodash и заюзать find/intersection
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы