【问题标题】:How to get the difference of two string arrays?如何获得两个字符串数组的差异?
【发布时间】:2019-04-20 13:14:38
【问题描述】:

我想得到两个字符串数组之间的确切区别。

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']

我是新手,你能指导我正确的方向吗?

【问题讨论】:

  • ["A", "B"] ["B", "A"] 的结果是什么?
  • 应该是一个空数组。
  • 为什么?这背后的逻辑是什么?
  • 我基本上有一个字符数组(array1)。如果用户输入了某些内容,则该字符将被添加到已使用的字符数组中。用户只能输入array1中的字符,如果用完了就不能再输入了。所以我必须有一个包含允许字符的数组,用于输入控制。

标签: javascript arrays string


【解决方案1】:

您可以关闭第二个数组的索引并增加索引并从结果集中删除此项。

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的(新)规范,顺序应该无关紧要。
  • 非常感谢。这需要一些时间来消化。
【解决方案2】:

您可以根据input 数组从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 现在你可以了 :)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多