使用JavaScript从另一个数组中删除数组元素

13

我有两个数组

a[] = [1,2,3,4]
b[] = [1,4]
需要从数组a中移除数组b的元素。 预期输出:
 a[] = [1,4]

2
你的意思是 b[] = [2,3] 吗? 想要得到你期望的 a[] = [1,4]。 - Hashim Otto
5个回答

16

我会使用过滤方法:

a = a.filter(function (item) {
    return b.indexOf(item) === -1;
});

1
难道不应该是:return b.indexOf(item) == -1; - Kolby
1
@Kolby 感谢您的纠正。右括号必须放在 item 之后,比较运算符应该是 === 而不是 !==。 - Barry127

4
const array_diff = (a, b) => a.filter(v => !b.includes(v))

如果您想支持IE
const array_diff = (a, b) => a.filter(v => b.indexOf(v) === -1);

2

我正在遍历第二个数组,并使用indexOf检查该值是否在第一个数组中。如果是,我将使用splice将其删除。

var a = [1,2,3,4,5];
var b = [3,4,5];

b.forEach(function(val){
  var foundIndex = a.indexOf(val);
  if(foundIndex != -1){
    a.splice(foundIndex, 1);
  }
});

或者

var a = [1,2,3,4,5];
var b = [3,4,5];

a = a.filter(x => b.indexOf(x) == -1);

对于IE 8,

for(var i = 0; i < b.length; i++){
   var val = b[i];
   var foundIndex = a.indexOf(val);
   if(foundIndex != -1){
      a.splice(foundIndex, 1);
   }
}

array.prototype.forEach - 在ECMAScript5中新增(即不支持<=IE8):https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Browser_compatibility - freedomn-m
@freedomn-m 是正确的。.forEach是ECMAScript5,所以你需要转译,使用一个有forEach方法的库,或者只是使用for循环。逻辑保持不变。 - Kolby
对于IE 8,for(var i = 0; i < b.length; i++){ var val = b[i]; var foundIndex = a.indexOf(val); if(foundIndex != -1){ a.splice(foundIndex, 1); } } - Aruna
添加了IE8。感谢@Aruna。 - Kolby

2

请查看jQuery文档中的$.grep$.inArray

以下是代码示例:

var first = [1,2,3,4],
    second = [3,4];

var firstExcludeSecond = $.grep(first, function(ele, ix){ return $.inArray(ele, second) === -1; });

console.log(firstExcludeSecond);

基本上就是遍历第一个数组($.grep),并确定给定的值是否在第二个数组中($.inArray)。如果从$.inArray返回的值为-1,则第一个数组中的值不存在于第二个数组中,因此我们会获取它。


0
function myFunction(a, b) {
  return a.filter(item => b.indexOf(item) < 0)
}

console.log(myFunction([1, 2, 3], [1, 2]))

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