Подтвердить что ты не робот

Javascript удалить массив из массива

Предположим, что мы имеем следующие массивы:

a = [1, 2, 3, 4, 5]

и

b = [2, 3]

Как я могу вычесть b из a? Итак, мы имеем c = a - b, который должен быть равен [1, 4, 5]. Решение jQuery также будет хорошо.

4b9b3361

Ответ 1

Предполагая, что вы находитесь в браузере с Array.prototype.filter и Array.prototype.indexOf, вы можете используйте это:

var c = a.filter(function(item) {
    return b.indexOf(item) === -1;
});

Если у данного браузера нет этих методов, вы можете их подделать.

Ответ 2

Для кода, который будет работать во всех браузерах, вам придется вручную найти каждый элемент из b в и удалить его.

var a = [1, 2, 3, 4, 5];
var b = [2, 3];

var result = [], found;
for (var i = 0; i < a.length; i++) {
    found = false;
    // find a[i] in b
    for (var j = 0; j < b.length; j++) {
        if (a[i] == b[j]) {
            found = true;
            break;
        }
    }
    if (!found) {
        result.push(a[i]);
    }
}
// The array result now contains just the items from a that are not in b

Рабочий пример здесь: http://jsfiddle.net/jfriend00/xkBzR/

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

var a = [1, 2, 3, 4, 5];
var b = [2, 3];

function filterArray(src, filt) {
    var temp = {}, i, result = [];
    // load contents of filt into object keys for faster lookup
    for (i = 0; i < filt.length; i++) {
        temp[filt[i]] = true;
    }

    // go through src
    for (i = 0; i < src.length; i++) {
        if (!(src[i] in temp)) {
            result.push(src[i]);
        }
    }
    return(result);
}

var filtered = filterArray(a, b);

Рабочий пример здесь: http://jsfiddle.net/jfriend00/LUcx6/

Ответ 3

Здесь реализация для try работает во всех браузерах:

if('filter' in Array == false) {
    Array.prototype.filter = 
        function(callback) {
            if(null == this || void 0 == this) {
                return;
             }
            var filtered = [];
            for(i = 0, len = this.length; i < len; i++) {
                    var tmp = this[i];
                    if(callback(tmp)) {
                        filtered.push(tmp);
                     }
             }
                return filtered;
       }
  }

a = [1, 2, 3, 4, 5]; 
b = [2, 3]; 

var c = a.filter(function(item) { /*implementation of icktoofay */
    return b.indexOf(item) === -1;
});

Ответ 4

Для тех, кто борется с объектами, например Date, вы обнаружите, что два разных объекта никогда не равны друг другу, даже если они имеют одинаковые значения, поэтому ответы выше не будут работать. Вот ответ на эту проблему в ES6.

const c = a.filter(aObject => b.findIndex(bObject => aObject.valueOf() === bObject.valueOf()) === -1)

Ответ 5

Это измененная версия ответа, отправленного @icktoofay.

В ES6 мы можем использовать:

Это упростит наш код, чтобы:

var c = a.filter(x => !b.includes(x));

Demo:

var a = [1, 2, 3, 4, 5];
var b = [2, 3];

var c = a.filter(x => !b.includes(x));
console.log(c);