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

Bra*_*mas 4 javascript

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

假设我们有:

array1 = ['A', 'B', 'C', 'D', 'E']; array2 = ['C', 'E'];
Run Code Online (Sandbox Code Playgroud)

有没有一个经过验证的快速解决方案来比较两个数组,返回一个数组,而两个数组中都没有出现值(这里是C和E).期望的解决方案:

array3 = ['A', 'B', 'D']
Run Code Online (Sandbox Code Playgroud)

但是,如果你有:

array1 = ['A', 'B', 'C', 'D', 'D', 'E']; array2 = ['D', 'E'];
Run Code Online (Sandbox Code Playgroud)

而你正在寻找的解决方案是:

array3 = ['A', 'B', 'C', 'D'] // don't wipe out both D's
Run Code Online (Sandbox Code Playgroud)

这是一些背景:

你正试图教学生如何运作句子.你给他们一个混乱的句子:

吃 - 猫 - 老鼠 - 的 -

他们开始输入答案:猫

您想要提示现在阅读:

吃 - 老鼠 -

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

这是我尝试过的:
(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; }
        })();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*all 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ash*_*eri 6

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

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

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

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

oldItems = oldItems.filter(n=>item.includes(n))
Run Code Online (Sandbox Code Playgroud)

这将仅返回 [2,3]。

  • 我会推荐 oldItems.filter(n =&gt; item.includes(n)); 这比接受的答案更可取。没有突变和更干净的代码。 (2认同)