2017-06-22 39 views
0

我想從Javascript中的數組數組中產生獨特的組合。從嵌套數組(JS)生成獨特的組合

Input: [ [1,1,3], [3,1,1], [4,4,4] ] 
Output: [ [1,1,3], [4,4,4] ] 

在這個例子中,是[3,1,1][1,1,3]重複。將數字添加到Set似乎不能解決重複數組的問題,並且對已排序的字符串化數組進行哈希處理似乎是一種破解。

編輯:尋找不涉及字符串數組的解決方案(如果存在)。

有沒有更好的方法來解決這個問題?

+0

你只是尋找獨特的陣列或也這些數組的組合 - 例如功率設置? –

+0

只是組合,所以我們會以不同的順序放入具有相同數字的數組。 – colorbynumber

+0

看來,你將不得不寫一個小程序來做到這一點。首先寫下英文需要完成的內容,包括如何計劃將數組與元素按不同順序進行比較。然後,把它寫成一個JavaScript程序。 – 2017-06-22 19:23:18

回答

0
var output=Object.keys(input.reduce((obj,el)=>(obj[el.sort().join()]=true,obj),{})).map(arr=>arr.split().map(e=>+e)); 

您可以對數組進行排序,使它們相等,然後使用散列表使整個事物唯一。

+0

請參閱http://jsbin.com/cutabazetu/edit?console以獲取工作示例 –

+0

不錯,您還需要重新映射才能返回到int。但是,這是'我試圖避免的'散列'排序,串化數組'。 – colorbynumber

+0

@colorbynumber爲什麼?它肯定是最簡單的... –

1

您可以使用具有排序的絃樂陣列的集合並相應地進行過濾。

var array = [[1, 1, 3], [3, 1, 1], [4, 4, 4]], 
 
    unique = array.filter(
 
     (s => a => (p => !s.has(p) && s.add(p))(a.slice().sort((a, b) => a - b).join()))(new Set) 
 
    ); 
 

 
console.log(unique);

稍微不同的方法而無需字符串化數組,但是與使用的長度的第一密鑰嵌套哈希表。

var array = [[1, 1, 3], [3, 1, 1], [4, 4, 4]], 
 
    unique = array.filter(function (hash) { 
 
     return function (a) { 
 
      var found = true; 
 
\t \t \t \t 
 
      a .slice() 
 
       .sort(function (a, b) { return a - b; }) 
 
       .reduce(function (r, k) { 
 
        found = found && r[k]; 
 
        return r[k] = r[k] || {}; 
 
       }, hash[a.length] = hash[a.length] || {}); 
 
      return !found; 
 
     }; 
 
    }(Object.create(null))); 
 

 
console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

映射陣列以原始散列值允許有效地識別重複 - 你的情況排列。

一個簡單的哈希函數是通過對數組進行排序並加入或串化來給出的,您更喜歡避免這種情況。

對於範圍有限的整數數組,您可以將每個整數n映射到第n個素數。這些主要因素的產物就是你的散列。由於產品可以在線時間來計算,這比具有成本排序,以存儲可能大陣素數的速度更快:

const primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61]; 
 

 
function hash(numbers) { 
 
    return numbers.reduce((prod, n) => prod * primes[n], 1); 
 
} 
 

 
function unique(arrays) { 
 
    let set = new Set(); 
 
    return arrays.filter(numbers => { 
 
    let h = hash(numbers); 
 
    return !set.has(h) && set.add(h); 
 
    }); 
 
} 
 

 
console.log(unique([[1,1,3], [3,1,1], [4,4,4]]));

+0

你使用Map和Nina的Set之間的運行時複雜性有什麼區別? – Rick

+1

Hi @Arrow,在運行時複雜性方面沒有什麼區別,但是第二個想法是我寧願去用'Set',因爲'Map.values()'迭代器在這裏沒什麼意義。 –