Javascript ::查找包含重复值的数组与该数组的唯一数组之间的差异

时间:2015-04-12 08:43:08

标签: javascript arrays loops

我在堆栈上发现了很多关于类似主题的帖子,但是没有一个在这里解决了这个问题。

<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数组相同。

现在它可以更轻松地找到双打。

3 个答案:

答案 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);