Javascript - 比较两个数组,返回差异,但是

时间:2013-01-25 04:30:34

标签: javascript

我发现很多帖子可以解决这个问题:

假设我们有:

array1 = ['A', 'B', 'C', 'D', 'E']; array2 = ['C', 'E'];

是否有一种经过验证的快速解决方案可以将两个数组相互比较,返回一个数组而不会在两个数组中出现这些值(此处为C和E)。期望的解决方案:

array3 = ['A', 'B', 'D']

但如果你有:

array1 = ['A', 'B', 'C', 'D', 'D', 'E']; array2 = ['D', 'E'];

你正在寻找解决方案:

array3 = ['A', 'B', 'C', 'D'] // don't wipe out both D's

以下是一些背景信息:

您正在尝试教授学生句子如何运作。你给他们一个混乱的句子:

ate - cat - mouse - the -

他们开始输入答案:猫

您希望提示现在阅读:

吃 - 鼠标 -

目前,我的代码取出了两个。

这是我尝试过的:
(zsentence是xsentence的副本,将被下面的代码操纵,join()ed并放到屏幕上)

for (i=0; i < answer_split.length; i++) {
for (j=0; j < xsentence.length; j++) {
        (function(){
            if (answer_split[i] == xsentence[j]) { zsentence.splice(j,1); return; }
        })();
    }
}

2 个答案:

答案 0 :(得分:14)

只需遍历要删除的元素数组。

var array1 = ['A', 'B', 'C', 'D', 'D', 'E'];
var array2 = ['D', 'E'];
var index;

for (var i=0; i<array2.length; i++) {
    index = array1.indexOf(array2[i]);
    if (index > -1) {
        array1.splice(index, 1);
    }
}

它是O(array1.length * array2.length)但是对于相当小的阵列和现代硬件,这不应该远程导致问题。

http://jsfiddle.net/mattball/puz7q/

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/splice

答案 1 :(得分:3)

您也可以使用过滤器。 请查看以下示例。

var item = [2,3,4,5];
var oldItems = [2,3,6,8,9];
oldItems = oldItems.filter(function(n){ return item.indexOf(n)>-1?false:n;});

所以这将返回[6,8,9]

如果您只想获得匹配的项目,那么您必须在下面编写代码。

oldItems = oldItems.filter(function(n){ return item.indexOf(n)>-1?n:false;});

这将仅返回[2,3]。