我想从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