javascript - NodeJS - 从数组中减去数组,而不是删除所有重复项

标签 javascript arrays node.js

标题可能没有多大意义,但你会如何做这样的事情:

a = [1, 2, 2, 3, 3, 3];
b = [1, 2, 3];
a.subtract(b);

我希望它返回 [2, 3, 3],而不是像类似问题的其他答案那样返回 [],它只保留根本不在其他数组中的项目,而不是只删除多少个在另一个数组中。

最佳答案

您可以为数组创建原型(prototype),并通过检查和消除找到的元素来过滤数组。

Array.prototype.subtract = function (array) {
    array = array.slice();
    return this.filter(function (a) {
       var p = array.indexOf(a);
       if (p === -1)  {
           return true;
       }
       array.splice(p, 1);
    });
}

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

console.log(a.subtract(b));

带有哈希表的更快版本:

Array.prototype.subtract = function (array) {
    var hash = Object.create(null);
    array.forEach(function (a) {
        hash[a] = (hash[a] || 0) + 1;
    });
    return this.filter(function (a) {
       return !hash[a] || (hash[a]--, false);
    });
}

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

console.log(a.subtract(b));

关于javascript - NodeJS - 从数组中减去数组,而不是删除所有重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46016990/

相关文章:

javascript - 在 Node.js 中监听所有发出的事件

javascript - 提供的参数与调用目标的任何签名不匹配,在类实例化时引发错误

javascript - 单击即可更改范围文本

arrays - 解释 local -a 'xkeys=("${ !'"$ 1"' [@] }")'

javascript - JS : mapping an array inside a push

javascript - 有什么办法可以简化这个 if/else block 吗?

javascript - 检查字符串包含 JavaScript 代码还是普通字符串?

javascript - 如果文本框中的值大于 1,则更改为复数

arrays - 数组与内存数据库

javascript - 如何知道查询中缺少哪些参数?