如何获取两个字符串数组的差异?

3
我想获得两个字符串数组之间的确切差异。
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']

我是新手,你能指引我朝正确的方向前进吗?


2
["A", "B"] ["B", "A"] 的结果是什么? - Jonas Wilms
应该是一个空数组。 - Fallc
为什么?这背后的逻辑是什么? - Jonas Wilms
我基本上有一个单词的字符数组(array1)。如果用户输入了什么,该字符将被添加到已使用的字符数组中。用户只能输入array1中的字符,如果其中一个被用完了,他就不能再输入它了。因此,我必须有一个允许字符的数组,用于输入控制。 - Fallc
可能是[获取两个数组之间的差异(包括重复项)]的重复问题(https://dev59.com/55vga4cB1Zd3GeqPzEL_)。 - adiga
3个回答

6
你可以使用闭包获取第二个数组的索引,并增加该索引,然后从结果集中删除该项。

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


根据OP(新)规范,顺序不应该有影响。 - Jonas Wilms
非常感谢。这需要一些时间来消化。 - Fallc

1
你可以根据输入数组从“allowed”中删除元素:
 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 将是您期望的最终结果。

谢谢!我尝试点赞了,但不幸缺少一些积分。 - Fallc
@fallc 现在你可以了 :) - Jonas Wilms

1

我认为在这里使用过滤器并不是正确的方法。因为有一些元素是重复的。使用简单的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)


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