2016-08-01 64 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

相關問題