在JavaScript或jQuery中,您能否从另一个数组中删除一个数组?

3

i have a three arrays in 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. 创建另一个数组,其与array4对齐的array1索引相应。因此,在这种情况下,我还想能够生成

    var array5 = new Array {2, 5}

我知道在dotnet 3.5中有很多简单的方法可以执行此操作,但不确定JavaScript是否有类似的东西。
9个回答

11

首先,数组声明有两种形式:

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

第二个选项更好,顺便提一下 在这里查看原因
你实际上要找的是叫做差异(而不是交集或并集)的东西。Stack Overflow 上有一些关于数组差异的其他问题,比如这个,然而被接受的解决方案在数组上使用了for..in,这不是一个好主意。我听说 Doug Crockford 通过互联网会直接打你的脸。如果你感兴趣,这里有一个更技术性的讨论这个问题的答案可能更适合你。

6
这可以通过JavaScript 1.6数组函数来简化:
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);

4

3
一种非常简短和高效的方式是使用:
_.difference(array1,array2)

这需要使用lodash或其他外部包,而你甚至没有提到它! - bot19

1
我建议实现以下内容: 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);

0

Underscore.js 包含差异和映射方法,以简化此过程:

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

0

这个解决方案仅在array2和array3只包含字符串或数字时才有效。

第一步,将array3转换为具有属性的对象(以便进行更快速的查找)。

var obj = {}, i;
for(i=0;i<array3.length;i++) {
    obj[array3[i]] = true;
}

步骤2:遍历array2并获取仅不在array3中的元素。
var array4 = [], array5 = [];
for(i=0; i<array2.length;i++) {
    if (!obj.hasOwnProperty(array2[i])) {
        array4.push(array2[i]);
        array5.push(array1[i]);
    }
}

0

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

0

这个 真的帮了我很多:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接