6

我找到了很多解决这个问题的帖子:

假设我们有:

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

这是一些上下文:

你正试图教学生句子是如何工作的。你给他们一个乱七八糟的句子:

吃了——猫——老鼠——那个——那个

他们开始输入答案:猫

您现在希望提示阅读:

吃了——老鼠——

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

这是我尝试过的:
(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; }
        })();
    }
}
4

2 回答 2

16

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

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

于 2013-01-25T04:35:04.070 回答
6

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

var item = [2,3,4,5];
var oldItems = [2,3,6,8,9];
oldItems = oldItems.filter(n=>!item.includes(n))

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

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

oldItems = oldItems.filter(n=>item.includes(n))

这将仅返回 [2,3]。

于 2017-08-25T10:47:00.580 回答