如何从arrayB中删除arrayA中的所有项?在javascript中

时间:2017-04-13 20:38:21

标签: javascript arrays

这感觉就像一个非常基本的javascript问题,但我有两个数组:

var arrayA =['content','I dont','want'];
var arrayB = ['content','want','puppies'];

期望的结果:

arrayB = ['puppies']

数组中的项目是字符串。

我该怎么做? (如果答案适用于IE8 +,可获得奖励积分)

7 个答案:

答案 0 :(得分:4)

您可以过滤arrayB并仅采用arrayA

中未包含的元素



var arrayA =['content','I dont','want'],
    arrayB = ['content','want','puppies'].filter(a => !arrayA.includes(a));

console.log(arrayB);




ES5



var arrayA =['content','I dont','want'],
    arrayB = ['content','want','puppies'].filter(function (a) {
        return arrayA.indexOf(a) === -1;
    });

console.log(arrayB);




答案 1 :(得分:1)

对于值类型,以下内容应该有效:(不是在IE8中 - 正如指出的那样!)

function (arrayA, arrayB) {
  return arrayB.filter(function(b) {
    return arrayA.indexOf(b) == -1;
  });
}

答案 2 :(得分:1)

  

从arrayB中删除arrayA中的所有项目

使用Array.prototype.forEach()Array.prototype.splice()函数的解决方案:



var arrayA =['content','I dont','want'],
    arrayB = ['content','want','puppies'];

arrayA.forEach(function (w) {
    var idx = arrayB.indexOf(w);
    ~idx && arrayB.splice(idx, 1);
});

console.log(arrayB);




答案 3 :(得分:0)

这将使您进入IE9,但IE8不支持indexOf。如果您绝对需要IE8支持,则必须为indexOf编写polyfill。

var arrayA =['content','I dont','want'];
var arrayB = ['content','want','puppies'];

for(var i = 0; i < arrayA.length; i++){
    var index = arrayB.indexOf(arrayA[i]);
  if(index !== -1) {
    arrayB.splice(index, 1);
  }
}

console.log(arrayB);

答案 4 :(得分:0)

这会让你进入IE8

var arrayA =['content','I dont','want'];
var arrayB = ['content','want','puppies'];

for (var i = arrayB.length - 1; i >= 0; i--) {
    for (var j = arrayA.length - 1; j >= 0; j--) {
        if (arrayA[j] == arrayB[i]) {
            arrayB.splice(i, 1);
        }
    }
}

console.log(arrayB);

答案 5 :(得分:0)

arrayA.forEach((valueA)=>{
    let idx = (arrayB.findIndex( (valueB)=>valueB === valueA))
    if(idx != -1){
      arrayB.splice(idx,1)
    }
})

答案 6 :(得分:0)

ES3解决方案。

&#13;
&#13;
var arrayA = ['content', 'I dont', 'want'];
var arrayB = ['content', 'want', 'puppies'];

for (var bIdx = arrayB.length - 1; bIdx >= 0; bIdx -= 1) {
  for (var aIdx = 0; aIdx < arrayA.length; aIdx += 1) {
    if (arrayB[bIdx] === arrayA[aIdx]) {
      arrayB.splice(bIdx, 1);
      break;
    }
  }
}

console.log(arrayB);
&#13;
&#13;
&#13;

请注意,外部循环(arrayB)反向运行,因为您将使用Array#splice从数组中删除项目,因此在迭代时它将被重新编入索引,这意味着您可能会错过一些项目,如果向前迭代。

有关更多示例和解释,请参阅以下内容。

How to remove element from array in forEach loop?

如果你为你使用的方法加载适当的填充程序,你可以愉快地在IE8上使用函数方法(只要你没有使用稀疏数组)。

https://github.com/es-shims/es5-shim

https://github.com/es-shims/es6-shim

https://github.com/es-shims/es7-shim

如果改变原始数组并不重要,那么可以使用Array#filter概念并用新数组替换旧数组。

&#13;
&#13;
var arrayA = ['content', 'I dont', 'want'];
var arrayB = ['content', 'want', 'puppies'];

var result = [];
for (var bIdx = 0; bIdx < arrayB.length; bIdx += 1) {
  var itemB = arrayB[bIdx];
  var found = false;
  for (var aIdx = 0; aIdx < arrayA.length; aIdx += 1) {
    if (itemB === arrayA[aIdx]) {
      found = true;
      break;
    }
  }
  if (found !== true) {
    result.push(itemB);
  }
}
arrayB = result;

console.log(arrayB);
&#13;
&#13;
&#13;

请注意,我们现在可以转发两个数组,因为它们没有被突变,也没有重新索引。