2015-04-12 20 views
2

我发现堆栈溢出的许多帖子关于该类似的主题,但他们都没有解决这个问题。Javascript ::查找包含重复值的数组与数组的唯一数组之间的差异

<script> 

//Array GanginaA contains duplicated values. 
//Array GanginaB contains only unique values that have been fetched from GanginaA 

GanginaA=[0,1,2,3,4,5,5,6,7,8,9,9]; 
GanginaB=[0,1,2,3,4,5,6,7,8,9]; 

var hezi=<!--The Magic Goes Here--> 

console.log(hezi); 

/* 
* Expected Output: 
* 5,9 
*/ 

</script> 

GanginaA总是会更长或相同GanginaB所以没有理由用较长的阵列长度的值来计算。

GanginaB将始终包含取自GanginaA的唯一值,因此它始终是较短的数组长度或与GanginaA数组相同。

现在,它使得它更容易找到双打。

回答

2

您可以使用过滤器来获取元素,如下面

GanginaA = [0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9]; 
GanginaB = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
var hezi = GanginaB.filter(function (item, index) { 
    return GanginaA.indexOf(item) !== GanginaA.lastIndexOf(item) 
}); 
console.log(hezi.join(" , ")); // 5, 9 
+0

您是DE男人!我爱你兄弟!非常感谢! :)))))))))))))) – davidmarko

+0

不客气:P – mohamedrias

1

JavaScript的对象具有的HashMap样的行为,这样你就可以像一组使用它们的一种。如果遍历所有值并将它们设置为对象内的键,则可以使用Object.keys方法获取唯一值的数组。

function uniqueValues() { 
    var unique = {}; 

    [].forEach.call(arguments, function(array) { 
    array.forEach(function(value) { 
     unique[value] = true; 
    }); 
    }); 

    return Object.keys(unique); 
}; 

该函数将返回作为参数传递的任意数量数组中的唯一元素。

uniqueValues([1, 2, 3], [ 1, 1, 1], [2, 2, 2], [3, 3, 3]); // [ 1, 2 3 ] 

一个缺点这种方法是使用Javascript强制将所有钥匙串,你可以通过改变return语句把它们放回号:

return Object.keys(unique).map(Number); 
2

我能想到的更容易:

var hezi=[]; 

for (var i=0;i<GanginaA.length;i++){ 
    hezi[GanginaA[i]] = GanginaA[i]; 
    hezi[GanginaB[i]] = GanginaB[i]; 
} 
hezi = hezi.filter (function(el){return el!=undefined;}); 

确实在O(n)的行动的一切,而不是为O(n^2)