你可以在javascript或jquery中从另一个数组中删除一个数组

我在javascript中有三个数组

var array1 = new Array (1,2,3,4,5); var array2 = new Array ("a", "b", "c", "d", "e"); var array3 = new Array ("a", "c", "d"); 

我基本上想要:

  1. 创建一个新数组,其中array2减去array3中的项目。 所以它应该导致

    var array4 = new Array {“b”,“e”};

  2. 使用与数组4对齐的array1的相应索引创建另一个数组,因此在这种情况下我还希望能够生成

    var array5 = new Array {2,5}

我知道在dotnet 3.5中有很多简单的方法来执行此操作,但不确定javascript是否有类似的东西。

好的,对于初学者来说,数组声明采用以下两种forms之一:

 var myArr = new Array(1, 2, 3); // or var myArr = [1, 2, 3]; 

第二种选择更好,顺便说一下。 请看这里的原因 。

你实际上寻找的东西叫做差异(与交叉或联合相对)。 关于arrays差异的Stack Overflow还有一些其他问题, 比如这个问题 ,但是接受的解决方案for .. in数组中for .. in ,这不是一个好主意。 每当你这样做的时候,我听到道格克罗克福德通过互联网从字面上打了你一拳。 如果您有兴趣, 这里有一个关于它的更多技术讨论 。

这个问题的答案可能更适合你。

使用Javascript 1.6 Array函数可以更简单:

 Array.prototype.remove = function(set){return this.filter( function(e,i,a){return set.indexOf(e)<0} )}; Array.prototype.mapTo = function(set,to){return this.map( function(e,i,a){return to[set.indexOf(e)]} )}; var array1 = [1,2,3,4,5]; var array2 = ["a", "b", "c", "d", "e"]; var array3 = ["a", "c", "d"]; var array4 = array2.remove(array3); var array5 = array4.mapTo(array2, array1); 

使用jQuery:

 var array4 = $.grep(array2, function(n, i){ return $.inArray(n, array3) == -1; }); 

对于纯JavaScript,请参阅以下问题:

  • Javascript数组差异
  • 使用Javascript数组计算集合差异的最快或最优雅的方法是什么?

一个非常简短有效的方法是使用:

 _.difference(array1,array2) 

我建议实施这些: http : //www.dustindiaz.com/sugar-arrays/

使数组工作变得更加容易。 您的问题的解决方案将如下所示:

 var array1 = [1, 2, 3, 4, 5], array2 = ["a", "b", "c", "d", "e"], array3 = ["a", "c", "d"], array5 = [], array4 = array2.filter(function(item, i) { var ok = array3.indexOf(item) === -1; if (ok) { array5.push(i + 1); } return ok; }); alert(array4); alert(array5); 

仅当array2和array3只有字符串或数字时,此解决方案才有效。

步骤1.将array3转换为具有属性的对象(以便更快地查找)

 var obj = {}, i; for(i=0;i 

第2步:循环遍历array2,只获取不在array3中的元素

 var array4 = [], array5 = []; for(i=0; i 

javascript是一种紧凑的语言,按设计。

如果您没有库,并希望在大多数浏览器中使用方便的方法,则需要编写一些代码。

 Array.prototype.lastIndex= function(what){ var L= this.length; while(L){ if(this[--L]=== what) return L; } return -1; } Array.prototype.remove= function(arg){ var what, L= arg.length, ax; while(L && this.length){ what= arg[--L]; while((ax= this.lastIndex(what))!= -1){ this.splice(ax, 1); } } return this; } var array2 = ["a", "b", "c", "d", "e"], array3 = ["a", "c", "d"]; alert(array2.remove(array3)) 

Underscore.js包含差异和地图方法以简化:

 var array4 = _.difference(array2, array3); var array5 = _.map(array4, function(i){ return array1[array2.indexOf(i)] }); 

这对我有帮助:

 var a = [1, 2, 3, 4]; var b = [2, 3, 4, 5]; var c = _.without.apply(_, [a].concat(b)); 
  Result: c = [1]