2013-03-02 22 views
-1

我想寫一個函數,它將返回傳遞的數組參數的聯合。Javascript:多個參數的聯合

我不想使用遞減while語句或下劃線_.union函數。

union([1,4,78,98],[45,56,3],[2,3,45]);

回報 - > [1,4,78,98,45,56,2]

這是我迄今爲止,它是不正確的:

union: function(){ 
     var i, j, k; 
     var newArray = []; 

     for(i = 0; i < arguments.length; i++){ 
     j = arguments[i]; 
     l = k[arguments[i]]; 
      for(){ 
       j = k[i]; 
       newArray.push(j); 
      } 
     } 
      return newArray; 
     } 

我希望我可以通過多個for循環獲得解決方案。

+2

什麼是你得到的結果呢?爲什麼它不正確? – 2013-03-02 22:37:09

回答

1

這個想法是扁平化然後刪除重複。在實用的風格,你可以做這樣的事情:

function union() { 
    var arrs = [].concat.apply([], arguments); 
    return arrs.filter(function(v, i) { 
    return arrs.indexOf(v) == i; 
    }); 
} 

這應該給你同樣的結果下劃線的union

演示:http://jsbin.com/azulok/1/edit

0

您可以使用.reduce()

union([1,4,78,98],[45,56,3],[2,3,45]); 

function union() { 
    return [].reduce.call(arguments, function(res, arr) { 
     return res.concat(arr.filter(function(item) { 
             return res.indexOf(item) === -1; 
            })) 
    }) 
} 

打破它一點,如果你喜歡:

function union() { 
    return [].reduce.call(arguments, function(res, arr) { 
     return res.concat(arr.filter(notIn(res))) 
    }) 
} 

function notIn(arr) { 
    return function(item) { 
     return arr.indexOf(item) === -1; 
    } 
} 

,當然你也可以重用.reduce()回調一樣,所以,如果你確實有數組陣列,你可以這樣做:

var res = arrays.reduce(joinUnique); 

function joinUnique(res, arr) { 
    return res.concat(arr.filter(notIn(res))) 
} 

function notIn(arr) { 
    return function(item) { 
     return arr.indexOf(item) === -1; 
    } 
} 
0

最簡單的方法是使用Set

const data = new Set([...[1,4,78,98], ...[45,56,3], ...[2,3,45]]); 
 

 
data.forEach(i => console.log(i));