2016-08-01 61 views
2

我对这个问题的简单的解决方案:在JavaScript中,是否有可能只使用.filter()删除重复项(第一个实例是保留的)?

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:

BIG由于@Kaspars和@gcampbell用于引入Set() !! 我现在有我的解决方案:

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

这仅仅是一个次要的修订gcampbell的回答,因为我必须将Set转换回Array使用[... new Set()]

+3

如何http://stackoverflow.com/a/14821032/670396 – elclanrs

+2

'新集([...参数]。降低((预,当前)=> pre.concat(现))' ? – gcampbell

回答

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); 
} 
+0

哇,感谢大O Notations。你会推荐什么样的参考来研究它? – jpls93

+0

@JohnPatrick下面是ES6对Set结构的引用http://www.ecma-international.org/ecma-262/6.0 /#sec-set.prototype.add它在一个散列映射中实现,因此它不是线性的,但也不是对数时间。性能更快,因为Array.indexOf不能从中受益 – Kaspars

相关问题