假设我们有以下数组:
a = [1, 2, 3, 4, 5]
和
b = [2, 3]
如何从a中减去b?因此我们c = a - b
应该等于[1, 4, 5]
。 jQuery解决方案也没问题。
答案 0 :(得分:43)
假设您使用的是Array.prototype.filter
和Array.prototype.indexOf
的浏览器,则可以使用此功能:
var c = a.filter(function(item) {
return b.indexOf(item) === -1;
});
如果相关浏览器没有这些方法,您可以对其进行填充。
答案 1 :(得分:2)
对于适用于所有浏览器的代码,您必须从a中手动查找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);
答案 2 :(得分:1)
这是@icktoofay发布的答案的修改版本。
在ES6中我们可以使用:
这会将我们的代码简化为:
var c = a.filter(x => !b.includes(x));
<强>演示:强>
var a = [1, 2, 3, 4, 5];
var b = [2, 3];
var c = a.filter(x => !b.includes(x));
console.log(c);
&#13;
答案 3 :(得分:0)
此处的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 :(得分:0)
对于那些与对象挣扎的人,比如Date,你会发现两个不同的对象永远不会彼此相等,即使它们具有相同的值,所以上面的答案是行不通的。 以下是ES6中此问题的答案。
const c = a.filter(aObject => b.findIndex(bObject => aObject.valueOf() === bObject.valueOf()) === -1)
答案 5 :(得分:0)
可能是一个过时的查询,但我认为这可能对某人有用。
let first = [1,2,3,4,5,6,7,9];
let second = [2,4,6,8];
const difference = first.filter(item=>!second.includes(item));
console.log(difference);//[ 1, 3, 6,7]
/*
the above will not work for objects with properties
This might do the trick
*/
const firstObj = [{a:1,b:2},{a:3,b:4},{a:5,b:6},{a:7,b:8}]//not ideal. I know
const secondObj = [{a:3,b:4},{a:7,b:8}]
const objDiff = firstObj.filter(obj=>
!secondObj.find(sec=>//take note of the "!"
sec.a===obj.a
&&//or use || if you want to check for either or
sec.b===obj.b
)//this is formatted so that it is easily readable
);
console.log(objDiff)/*
[
{
"a": 1,
"b": 2
},
{
"a": 5,
"b": 6
}
]
*/