2014-05-29 3 views
2

Предположим, что у меня есть этот массив:Удаление массивов из других массивов

a = [ 
    [2823832908, 10071920], 
    [5384625228, 10924221], 
    [8488934028, 313411415], 
    [2823828588, 10071580], 
    [5224682868, 14919881], 
    [8155986228, 560217208], 
    [3458951628, 10071570], 
    [6382592388, 25064430], 
    [5021452668, 10924221], 
    [8827673748, 59397160], 
    [8647215588, 26343621] 
] 

и этот массив:

b = [ 
    [8488934028, 313411415], 
    [8647215588, 26343621] 
] 

Как я могу получить новый массив, содержащий значения в массиве a, которые не являются в массиве b, или как я могу удалить значения в массиве b из массива a?

+1

http://stackoverflow.com/questions/1187518/javascript-array-difference – techouse

+0

Считаете ли вы кортеж быть одно значение? – Halcyon

+0

использовать регулярные выражения и Array.prototype.Возможно, сращивание также может помочь – Hawk

ответ

2
  1. Создать пустой массив результатов.
  2. перебрать a, выберите его текущий элемент т.е. [2823832908, 10071920]

  3. Сравнить текущий элемент для равенства в отношении каждого элемента Ь, для сравнения равенства вы можете использовать JSON.stringify или .join создать строковое представление массивов.

  4. Если текущий элемент не соответствует ни одному элементу b, добавьте его в массив результатов.

  5. Повторите.

a = [ 
       [2823832908, 10071920], 
       [5384625228, 10924221], 
       [8488934028, 313411415], 
       [2823828588, 10071580], 
       [5224682868, 14919881], 
       [8155986228, 560217208], 
       [3458951628, 10071570], 
       [6382592388, 25064430], 
       [5021452668, 10924221], 
       [8827673748, 59397160], 
       [8647215588, 26343621] 
]; 
b = [ 
     [8488934028, 313411415], 
     [8647215588, 26343621] 
    ]; 


    var result = []; 
    a.forEach(
     function(elem,idx,arr) 
     { 
      var sig = JSON.stringify(elem); 
      var match = false; 
      for(var i=0;i<b.length;i++) 
      { 
       if(sig == JSON.stringify(b[i])) 
        { 
        match = true; 
        break; 
        } 
      } 
      if(match === false) 
       { 
        result.push(elem); 
       } 
     } 
     ); 

    console.log(result); 

демо: http://jsfiddle.net/Ag39M/4/

+1

Это хороший ответ, но стоит отметить, что 'JSON.stringify' не является отличным способом сравнения массивов. [См. Сравнение производительности наших методов для почему] (http://jsperf.com/filtering-arrays). – lonesomeday

+0

@lonesomeday Спасибо за анализ производительности. Да, OP может использовать более оптимизированные методы для сравнения массивов. Я использовал JSON.stringify, предполагая меньшие затраты и простоту. – DhruvPathak

0
function arra_diff(a, b) 
{ 
    var arr=[], diff=[]; 
    for(var i=0;i<a.length;i++) 
    arr[a[i]]=true; 
    for(var i=0;i<b.length;i++) 
    if(arr[b[i]]) delete arr[b[i]]; 
    else arr[b[i]]=true; 
    for(var k in arr) 
    diff.push(k); 
    return diff; 
} 

или

function arra_diff(d, c) { /* d=a,c=b */ 
    for (var b = [], e = [], a = 0; a < d.length; a++) { 
     b[d[a]] = !0; 
    } 
    for (a = 0; a < c.length; a++) { 
     b[c[a]] ? delete b[c[a]] : b[c[a]] = !0; 
    } 
    for (var f in b) { 
     e.push(f); 
    } 
    return e; 
}; 
+0

Я проголосовал за это не потому, что это неправильно, а потому, что он нечитабелен и раскоментирован и поэтому не является хорошим ответом StackOverflow. – lonesomeday

1

Это немного сложно, в основном потому, что два массива не равны в Javascript, даже если они имеют одни и те же ключи ,

Вы должны сравнить их вручную, например с this function by Tim Down.

Затем вам нужно будет пропустить значения в первом массиве и сравнить их со всеми значениями во втором массиве.

код может выглядеть следующим образом:

var filtered = []; 

// loop through every element in a 
a.forEach(function(elA) { 
    // loop through every element in b 
    // if the elA is identical to any elB, some will immediately return true 
    // if elA is not identical to any elB, it will return false 
    var found = a.some(function(elB) { 
     return arraysIdentical(elA, elB); 
    }); 

    // if we didn't find any equal ones, we'll add elA to the filtered array 
    if (!found) { 
     filtered.push(elA); 
    } 
}); 

Обратите внимание, что это зависит от Array#forEach и Array#some. Если вам нужно поддерживать старые браузеры, вам нужно будет их подкрепить, с кодом полифония в этих ссылках.

1

Вот реализация с использованием undescore.js.

function diff(a1, a2) { 
    return _.filter(a1, function(e1) { 
    return !_.some(a2, function(e2) { 
     return _.isEqual(e1, e2); 
    }); 
    }); 
} 

Пример:

var a = [ [ 1, 2 ], [ 3, 4 ], [ 5, 6, 7 ], [ 8 ], [ 9 ] ]; 
var b = [ [ 1, 2 ], [ 8 ], [ 9 ] ]; 

console.log(diff(a, b)); 
// [ [ 3, 4 ], [ 5, 6, 7 ] ] 
Смежные вопросы