在JavaScript中,是否可以仅使用.filter()来删除重复项(第一个实例是保留的实例)?

时间:2016-08-01 09:53:25

标签: javascript arrays filter duplicates

我有一个直截了当的解决方案:

function removeExtra(arr) {
  var args = [...arguments]
  .reduce(function(prev,curr){return prev.concat(curr)});
  var answer = [];
  for (var i = 0; i < args.length; i++) {
    if (answer.indexOf(args[i]) == -1)
        answer.push(args[i]);
  }
  return answer;
}

console.log(removeExtra([1, 3, 2], [5, 2, 1, 4], [2, 1]));
//-> Returns [1, 3, 2, 5, 4]

但是,我正在尝试练习JavaScript的功能方法的逻辑,在本例中为.filter()。有没有办法这样做?

function removeExtra(arr) {
  return [...arguments]
  .reduce( (pre,cur) => pre.concat(cur) )
  //.filter( x => ??? );
}

console.log(removeExtra([1, 3, 2], [5, 2, 1, 4], [2, 1]));
//-> Should be [1, 3, 2, 5, 4]

编辑1:

正如所建议的那样,目前正在研究Set()。这是我第一次遇到它。马上回去做研究工作!

编辑2:

非常感谢@Kaspars和@gcampbell介绍Set() !! 我现在有了解决方案:

function removeExtra(someArgs) {
  return [... new Set(
    [...arguments].reduce(function(prev,curr){
            return prev.concat(curr);
    })
  )]
}

这只是对gcampbell回答的一个小修改,因为我必须使用SetArray转换回[... new Set()]

1 个答案:

答案 0 :(得分:2)

您可以使用Set进行此操作。

function removeExtra() {
    const uniques = new Set();

    for(const array of ...arguments) {
        for(const element of array) {
            uniques.add(element);
        }
    }

    return Array.from(uniques);
}