2017-06-22 69 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()'迭代器在这里没什么意义。 –