我在堆栈上发现了很多关于类似主题的帖子,但是没有一个在这里解决了这个问题。
<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数组相同。
现在它可以更轻松地找到双打。
答案 0 :(得分: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
答案 1 :(得分: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)
答案 2 :(得分: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);