Предположим, что мы имеем следующие массивы:
a = [1, 2, 3, 4, 5]
и
b = [2, 3]
Как я могу вычесть b из a? Итак, мы имеем c = a - b
, который должен быть равен [1, 4, 5]
. Решение jQuery также будет хорошо.
Предположим, что мы имеем следующие массивы:
a = [1, 2, 3, 4, 5]
и
b = [2, 3]
Как я могу вычесть b из a? Итак, мы имеем c = a - b
, который должен быть равен [1, 4, 5]
. Решение jQuery также будет хорошо.
Предполагая, что вы находитесь в браузере с Array.prototype.filter
и Array.prototype.indexOf
, вы можете используйте это:
var c = a.filter(function(item) {
return b.indexOf(item) === -1;
});
Если у данного браузера нет этих методов, вы можете их подделать.
Для кода, который будет работать во всех браузерах, вам придется вручную найти каждый элемент из 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/
Здесь реализация для 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;
});
Для тех, кто борется с объектами, например Date, вы обнаружите, что два разных объекта никогда не равны друг другу, даже если они имеют одинаковые значения, поэтому ответы выше не будут работать. Вот ответ на эту проблему в ES6.
const c = a.filter(aObject => b.findIndex(bObject => aObject.valueOf() === bObject.valueOf()) === -1)
Это измененная версия ответа, отправленного @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);