2011-09-13 40 views
5

我在JavaScript中遇到了一个问题。给定两个数组,返回一个只包含非相交项的数组

我有两个数组,我想检查它们是否与某些元素相交,然后删除这些元素并返回没有相交元素的新数组。

例如:

Array A ( 
[0] => 0 [1] => 1 
) 

Array B ( 
[0] => 2 [1] => 1 
) 

我要检查他们,并返回:

Array result ( 
[0] => 0 [1] => 2 
) 

我怎样才能做到这一点在JavaScript?

+3

http://stackoverflow.com/questions/1885557/simplest-code-for- array-intersection-in-javascript – Gerry

+0

thx对于响应,但是这个问题是关于返回一个带有相交元素的数组。我想删除它们,并将其余的返回给新的数组 –

回答

8

结帐库underscore.js

说你有两个数组,

var a = [1, 2]; 
var b = [2, 3]; 

首先找到了工会。

var all = _.union(a, b); 

然后找到交集。

var common = _.intersection(a, b); 

最后的答案应该是工会和路口的区别。

var answer = _.difference(all, common) 
+2

+1 [Working example。](http://jsbin.com/ayujef/edit#javascript, live)可能安全地假设下划线代码是可接受的,因为jQuery显然已经被加载 – user113716

+0

感谢您的工作示例 - 看起来不错:)下划线在哲学上类似于jQuery,尺寸也不是太大,但它所有都取决于OP的要求 – Anurag

2

好吧,既然你指定的jQuery,试试这个:

var arr1 = [2, 3, 4]; 
var arr2 = [1, 2, 3]; 

var arr3 = $.merge($.grep(arr1, function(el, idx) { 
    return $.inArray(el, arr2) > -1; 
}, true), $.grep(arr2, function(el, idx) { 
    return $.inArray(el, arr1) > -1; 
}, true)); 

alert(arr3); 

它可能不是很有效,但它是比较简洁。

+0

thankx为响应,但我怎么能实现这一点,并返回一个数组没有相交的元素? –

+0

更新了我的回答 – Blazemonger

4

使用Array.filterArray.lastIndexOf,和Array.indexOf

var array1 = [1,2,3,4,5]; 
var array2 = [2,3]; 
var unique = array1.concat(array2) 
        .filter(function (item, index, array) { 
         return array.indexOf(item) == array.lastIndexOf(item); 
        }) 

无论方法是通过默认100%跨浏览器,但具有安全垫片两个链路的IE < = 8

+0

感谢abstractdownvotefactor,数组存放在一个var中,并且不知道它是否索引这些元素。 –

+0

没关系,我会编辑来证明这一点。 – Joe

+0

这不会给你'array2'中不出现在'array1'中的元素。 OP的例子似乎表明所有独特的价值都保留下来。 – user113716

0

平原JS溶液,效率不高时,使用的jQuery为:

function filter(a1, a2){ 
 
    var result = []; 
 
    for(i in a1){ 
 
    exists = false; 
 
    for(j in a2){ 
 
     if(a1[i] == a2[j]) 
 
     exists = true; 
 
    } 
 
    if(exists== false){ 
 
     result.push(a1[i]); 
 
    } 
 
    } 
 
    return result; 
 
} 
 

 
var arr1 = [1,2,3,4,5]; 
 
var arr2 = [4,5,6,7,8]; 
 
var result1 = filter(arr1, arr2); 
 
var result2 = filter(arr2, arr1); 
 

 
var result = result1.concat(result2);

+0

你真的不应该在Array *上使用'for-in' *(在JavaScript中)*。 – user113716

+0

我终于使用了下划线插件和@anurag的代码感谢你的帮助 –

+0

@patrick dw :同意不应该在JavaScript中使用for-in,因为解析元素的顺序很重要,这是它唯一的缺点,我认为。 – mooglife

相关问题