这感觉就像一个非常基本的JavaScript问题,但我有两个数组:如何从arrayB中删除arrayA中的所有项目?在JavaScript
var arrayA =['content','I dont','want'];
var arrayB = ['content','want','puppies'];
期望的结果:
arrayB = ['puppies']
阵列中的项目是字符串。
我该怎么做?
这感觉就像一个非常基本的JavaScript问题,但我有两个数组:如何从arrayB中删除arrayA中的所有项目?在JavaScript
var arrayA =['content','I dont','want'];
var arrayB = ['content','want','puppies'];
期望的结果:
arrayB = ['puppies']
阵列中的项目是字符串。
我该怎么做?
你可以过滤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 - 正如指出的!)
function (arrayA, arrayB) {
return arrayB.filter(function(b) {
return arrayA.indexOf(b) == -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);
这会让你下降到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);
这将让你到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);
arrayA.forEach((valueA)=>{
let idx = (arrayB.findIndex((valueB)=>valueB === valueA))
if(idx != -1){
arrayB.splice(idx,1)
}
})
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);
请注意,我们现在可以向前遍历两个数组,因为它们不被突变并没有重新索引正在发生。
你有什么试过?也许一个好的起点是如何从数组中删除某些东西? – aug
为什么在arrayB的元素是小狗在这里。我的意思是这里实际发生了什么样的操作。 –
什么应该发生在“我不在”这里? –