Сравните два многомерных массива в JavaScript

У меня есть два массива:

var array_old = [{id:"5436", title:"I Like you boy"}, {id:"5437", title:"Hello how are you"}];
var array_new = [{id:"5436", title:"I Like you boy"}, {id:"1132", title:"I'm fine"}];

$.each(array_old, function(id, array)
{
    if(!$.inArray(array['id'], array_new, 1)>-1){
        alert(array['id'] + " does not exist in array_new");
    }
});

Я хочу проверить, существуют ли идентификаторы array_old в array_new, поэтому яожидая, что код выведет "5437 не существует в array_new " в этом примере.

Я могу'не могу найти какую-либо функцию, которая позволила бы мне это сделать, так как мне это сделать?

 Aleix21 нояб. 2012 г., 00:56
@meetamit также говорит, что 5436 не существует, но он существует, поэтому скрипт не работает
 Bergi21 нояб. 2012 г., 01:01
Вы ожидаете, что массивы будут в том же порядке? Было бы хорошо, чтобы отсортировать их?
 meetamit21 нояб. 2012 г., 00:50
Какие'с вопросом ??? Вы говорите, что выожидаешь этоalert(), но это'не делает это? Потому что это действительно так:jsfiddle.net/VHb3Q

Ответы на вопрос(4)

http://jsfiddle.net/tppiotrowski/VHb3Q/2/

    id: "5436",
    title: "I Like you boy"},
{
    id: "5437",
    title: "Hello how are you"}];
var array_new = [{
    id: "5436",
    title: "I Like you boy"},
{
    id: "1132",
    title: "I'm fine"}];

$.each(array_old, function(old_index, old_obj) {
    var old_id = old_obj['id'];
    var found = false;
    $.each(array_new, function(new_index, new_obj) {
        if (new_obj['id'] == old_id) {
            found = true;
        }
    });
    if (!found) {
        alert(old_id + " does not exist in array_new");
    }
});​

но я нене знаю, если это лучший способ сделать это:

var array_old = [{id: "5436",title: "I Like you boy"},{id: "5437",title: "Hello how are you"},{id: "5438",title: "Hello how are you2"}];
var array_new = [{id: "5436",title: "I Like you boy"},{id: "1132",title: "I'm fine"}];

$.each(array_old, function(id, array){

    found = 0;

    $.each(array_new, function(id2, array2) {

        if(array['id']==array2['id'])
        {
            found++;
        }

    });

    if(found==0)
    {
        alert(array['id']+' does not exist in array_new');
    }

});

http://jsfiddle.net/FAb3k/2/

 teddybeard21 нояб. 2012 г., 01:00
это решение выглядит приемлемым. ты можешь сказатьvar found = 0; сохранить переменную в локальной области, тем самым предотвращая ее загрязнение глобального пространства имен.
 charlietfl21 нояб. 2012 г., 01:55
Вы можете сломатьeach использование циклаreturn false улучшить производительность также, когда значение найдено

насколько велики ваши массивы - вы можете использовать более производительное решение.

Самое простое решение (которое вы и @Tebb нашли) имеетΘ(n*m)Если вы немного оптимизируете это (если вы не нашли элемент - см. @Gonchuki), вы все еще вO(n*m)Можно предположить, что оба массива находятся в одном и том же порядке и выполнять только один цикл:O(min(n,m)), Если ты'мне нужно отсортировать их до этого, тыЯ получил.O(n*log n+m*log m)Лучше всего будет использовать хэш-таблицу дляO(1) поиск, в результате чегоO(n+m), Вы можете легко использовать объект JS для этого :(
var counts = {};
for (var i=0; i<array_new.length; i++)="" counts[array_new[i].id]="(counts[array_new[i].id]" ||="" 0)="" +="" 1;="" return="" array_old.every(function(item)="" {="" item.id="" in="" counts="" &&="" counts[item.id]--;="" });="" <="" code=""></array_new.length;>

<a href="http://jsfiddle.net/t3Ary/4/">Демо-версия)</a>

 carl crott14 июн. 2013 г., 23:49
jsfiddle.net/t3Ary/3   <<< Я 'получаю вывод .. но я нене следует, зачем ставить в заданные пары КВ в счетчиках?
 carl crott14 июн. 2013 г., 20:52
Не могли бы вы реализовать это в jsfiddle?
 carl crott15 июн. 2013 г., 00:09
Максимум, что я могу придумать, это "return array_old.every " дает нам значение, индексируется ли элемент в счетчиках ... Но текущая версия возвращает false ... который недико полезно
 Bergi15 июн. 2013 г., 14:48
Это неT пары KV вcounts, но только ключи (ids) которые вы искали. Он считает их за идентификатор (как правило, приведет к1), а затем требует для каждого элемента вarray_old иметь положительный счет (и уменьшать его, чтобы обнаружить несколько случаев). Возвращаетсяfalse если массивы не совпадают, иtrue иначе.

что это работает, и это 'в конечном итоге легче читать (понятия не имею о производительности, но давайтеs пропустить это, так как яЯ делаю это, чтобы показать другой способ сделать это)

var ids_old = $.map(array_old, function(item) { return item.id; });
var ids_new = $.map(array_new, function(item) { return item.id; });

var duplicates = $.grep(ids_old, function(i, id) { 
    return $.inArray(id, ids_new) !== -1;
});

Имейте в виду, что конечным результатом является то, что вы получаете список дублирующих идентификаторов, этот другой вариант позволяет вам собрать сам элемент:

var ids_new = $.map(array_new, function(item) { return item.id; });

var duplicates = $.grep(array_old, function(i, item) { 
    return $.inArray(item.id, ids_new) !== -1;
});

Бонусные очки: даже если его пример - чистый jQuery, обратите внимание, что в браузерах, совместимых с ECMAScript5, вы можете использовать аналоги собственного массива для достижения того же результата.

Ваш ответ на вопрос