如何在jquery或javascript中从两个不同的数组中查找唯一记录?

时间:2011-05-06 05:08:32

标签: javascript jquery javascript-framework

我想从两个不同的数组中获取唯一值。

JavaScript中有两个数组:

<script>
var a=new Array;
var b=new Array;
a={'a','b','c','d','e'}
b={'a','d','e','c'} 
</script>

我希望输出如下:

new array => {'a','c','d','e'}

如何使用JavaScript原型函数或jQuery函数从两个数组中找到唯一记录?

5 个答案:

答案 0 :(得分:8)

我不知道你的条款是否正确。对我来说,唯一值将是在任一数组中只出现一次的成员。根据您的示例,您似乎希望成员存在于两个数组中(公共值或交集)。

您可以使用jQuery来处理这个问题。 grep()是你的朋友。

您可以在没有jQuery的情况下执行此操作,但我不确定原生filter()indexOf()方法是否具有最佳浏览器支持。

var a = ['a', 'b', 'c', 'd', 'e'],
    b = ['a', 'd', 'e', 'c'];

var common = $.grep(a, function(element) {
    return $.inArray(element, b) !== -1;
});

console.log(common); // ["a", "c", "d", "e"]

使用下划线可以轻松_.intersection(arr1, arr2)

jsFiddle

答案 1 :(得分:2)

我认为你真的打算写:

<script type="text/javascript">
var a = ['a','b','c','d','e'];
var b = ['a','d','e','c']; 
</script>

在任何情况下,您都可以对数组进行排序,并从不在另一个中的值中获取值,反之亦然,然后将两个集合连接成一个。你似乎被宠坏了选择,所以这是一个很好的基本javascript版本,应该适用于大多数浏览器。使用最新浏览器的新功能肯定会在旧浏览器中失败。

// Compares a to b. Returns all the elements in a that are not in b
// If c provided, add unique elements to c
function getUnique(a, b, c) {
  var c = c || [];
  var ta = a.slice().sort();
  var tb = b.slice().sort();
  var x, y, found = false;
  for (var i=0, iLen=ta.length; i<iLen; i++) {
    x = ta.shift();

    for (var j=0; j<tb.length && !found; j++) { // j.length changes each loop
      if (tb[j] == x) {
        tb.splice(j,1);  // Remove match from b
        found = true;
      }
    }
    if (!found) {
      c.push(x); // If no match found, store in result
    }
    found = false;
  }
  return c;
}
var a = ['a','b','d'];
var b = ['b','e'];

var d = getUnique(a, b);
alert(d);

var c = getUnique(b,a,d);
alert(d);

但是你对第一个答案的评论表明你想要两个数组共有的元素,这更简单:

function getCommon(a, b) {
  var c = [];
  var ta = a.slice().sort();
  var tb = b.slice().sort();
  var t, found;

  for (var i=0, iLen=ta.length; i<iLen; i++) {
    t = ta[i];
    found = false;

    for (var j=0, jLen=tb.length; j<jLen && !found; j++) {
      if (t == tb[j]) {
        c.push(tb.splice(j,1));
        found = true;
      }
    }
  }
  return c;
}

alert(getCommon(a, b));

您需要弄清楚如何处理重复项。在第一种情况下,如果另一个数组中没有重复项,则重复项将被视为唯一。在上文中,重复项无关紧要,除非它们在两个数组中都是重复的。

答案 2 :(得分:1)

查找orignal答案:JavaScript array difference

在这种情况下,您可以使用Set。它针对这种操作进行了优化(联合,交集,差异)。

一旦不允许重复,请确保它适用于您的情况。

var a = new JS.Set([1,2,3,4,5,6,7,8,9]);
var b = new JS.Set([2,4,6,8]);

a.intersection(b);//intersect will give you the common one

答案 3 :(得分:1)

我想借助JavaScript中的关联数组支持来完成此操作。

<script>
var a=new Array;
var b=new Array;
a={'a','b','c','d','e'}
b={'a','d','e','c'} 

var uniqueArray = new Array;
var tempArray = new Array;

var j = 0;
for(var i = 0; i < a.length; i++) {
    if(!tempArray[a[i]]) {
        tempArray[a[i]] = true;
        uniqueArray[j++] = a[i];
    }
}

for(i = 0; i < b.length; i++) {
    if(!tempArray[b[i]]) {
        tempArray[b[i]] = true;
        uniqueArray[j++] = b[i];
    }
}

</script>

答案 4 :(得分:1)

像这样:

var a=['a','b','c','d','e']; //Use brackets
var b=['a','d','e','c']

var c = a.concat(b).sort();

var uniques = {};

for(var i=0; i<c.length; i++){
   uniques[c[i]] = true;
}
var uniquesArray = [];
for(var u in uniques)
  uniquesArray.push(u)

现在uniquesArray只包含唯一值。 希望这有助于