我想得到两个字符串数组之间的确切区别。
const array1 = ['T','E','A','P','A','P','E','R'];
const array2 = ['T','A','P'];
预期输出数组:
['E','A','P','E','R']
我试过这个方法:
const output = array1.filter(char => array2.includes(char));
但是这会删除角色的所有实例,例如:
['E','E','R']
我是新手,你能引导我走向正确的方向吗?
您可以对第二个数组的索引进行闭包,并递增索引并从结果集中删除此项。
var array1 = ['T', 'E', 'A', 'P', 'A', 'P', 'E', 'R'],
array2 = ['T', 'A', 'P'],
result = array1.filter((i => v => array2[i] !== v || !++i)(0));
console.log(result);
没有预定义的array2
顺序的不同方法。
var array1 = ['T', 'E', 'A', 'P', 'A', 'P', 'E', 'R'],
array2 = ['T', 'A', 'P'],
set2 = new Set(array2)
result = array1.filter(v => !set2.delete(v));
console.log(result);
您可以根据allowed
数组从input
中删除元素:
const allowed = ['T','E','A','P','A','P','E','R'];
const input = ['T','A','P'];
for(const char of input) {
const pos = allowed.indexOf(char);
if(pos === -1) {
// char doesnt exist?
} else {
allowed.splice(pos, 1);
}
}
然后allowed
将是你最终的预期结果。
我认为过滤器在这里不正确。因为有一些元素重复了。使用简单的for循环。将结果添加到结果中时删除元素。
const array1 = ['T','E','A','P','A','P','E','R'];
const array2 = ['T','A','P'];
const copy = [...array2];
let res = [];
for(let i = 0;i<array1.length;i++){
let index = copy.indexOf(array1[i]);
if(index === -1){
res.push(array1[i]);
}
else copy.splice(index,1);
}
console.log(res)