javascript从数组中删除数组

假设我们有以下数组:

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

 b = [2, 3] 

如何从a中减去b? 所以我们有c = a - b ,它应该等于[1, 4, 5] 。 jQuery解决方案也没关系。

假设您使用的是具有Array.prototype.filterArray.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/

而且,这是一个对大型数组来说可能更快的版本,因为它将所有内容放入一个对象中进行散列查找而不是powershell数组搜索:

 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/

这是@icktoofay发布的答案的修改版本。

在ES6中,我们可以使用:

  • Array.prototype.contains()
  • Array.prototype.filter()
  • Arrow functions

这将简化我们的代码:

 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); 

这里的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)