我想從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似乎不能解決重複數組的問題,並且對已排序的字符串化數組進行哈希處理似乎是一種破解。
編輯:尋找不涉及字符串數組的解決方案(如果存在)。
有沒有更好的方法來解決這個問題?
我想從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似乎不能解決重複數組的問題,並且對已排序的字符串化數組進行哈希處理似乎是一種破解。
編輯:尋找不涉及字符串數組的解決方案(如果存在)。
有沒有更好的方法來解決這個問題?
var output=Object.keys(input.reduce((obj,el)=>(obj[el.sort().join()]=true,obj),{})).map(arr=>arr.split().map(e=>+e));
您可以對數組進行排序,使它們相等,然後使用散列表使整個事物唯一。
請參閱http://jsbin.com/cutabazetu/edit?console以獲取工作示例 –
不錯,您還需要重新映射才能返回到int。但是,這是'我試圖避免的'散列'排序,串化數組'。 – colorbynumber
@colorbynumber爲什麼?它肯定是最簡單的... –
您可以使用具有排序的絃樂陣列的集合並相應地進行過濾。
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; }
映射陣列以原始散列值允許有效地識別重複 - 你的情況排列。
一個簡單的哈希函數是通過對數組進行排序並加入或串化來給出的,您更喜歡避免這種情況。
對於範圍有限的整數數組,您可以將每個整數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]]));
你使用Map和Nina的Set之間的運行時複雜性有什麼區別? – Rick
Hi @Arrow,在運行時複雜性方面沒有什麼區別,但是第二個想法是我寧願去用'Set',因爲'Map.values()'迭代器在這裏沒什麼意義。 –
你只是尋找獨特的陣列或也這些數組的組合 - 例如功率設置? –
只是組合,所以我們會以不同的順序放入具有相同數字的數組。 – colorbynumber
看來,你將不得不寫一個小程序來做到這一點。首先寫下英文需要完成的內容,包括如何計劃將數組與元素按不同順序進行比較。然後,把它寫成一個JavaScript程序。 – 2017-06-22 19:23:18