2017-04-13 62 views
0

这感觉就像一个非常基本的JavaScript问题,但我有两个数组:如何从arrayB中删除arrayA中的所有项目?在JavaScript

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

期望的结果:

arrayB = ['puppies'] 

阵列中的项目是字符串。

我该怎么做?

+0

你有什么试过?也许一个好的起点是如何从数组中删除某些东西? – aug

+0

为什么在arrayB的元素是小狗在这里。我的意思是这里实际发生了什么样的操作。 –

+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);
(加分,如果答案在IE8 +工程)

1

对于值类型,下面应该工作:(唉不是在IE8 - 正如指出的!)

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

这不会在IE8中工作。 IE8不支持过滤器或indexOf – jas7457

+0

@ jas7457我想我真的很清楚'深入'过滤器。虽然'indexOf()'支持IE8的缺乏对我来说真的是新闻!每天学些新东西! – ne1410s

+0

你可以添加indexOf到IE8 http://stackoverflow.com/questions/3629183/why-doesnt-indexof-work-on-an-array-ie8 – genichm

1

删除所有项目在arrayA从arrayB

该解决方案使用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);

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); 
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); 
0
arrayA.forEach((valueA)=>{ 
    let idx = (arrayB.findIndex((valueB)=>valueB === valueA)) 
    if(idx != -1){ 
     arrayB.splice(idx,1) 
    } 
}) 
0

ES3的解决方案。

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

注意,外环(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概念,用新的替换旧的阵列。

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

请注意,我们现在可以向前遍历两个数组,因为它们不被突变并没有重新索引正在发生。