Javascript算法在数组中查找不在另一个数组中的元素

IT技术 javascript jquery algorithm arrays
2021-02-13 23:58:26

我正在寻找一种好的算法来获取一个数组中不是另一个数组中的元素的所有元素。所以给定这些数组:

var x = ["a","b","c","t"];
var ​​​​​​​​​y = [​​​​​​​"d","a","t","e","g"];

我想以这个数组结束:

var z = ["d","e","g"];

我正在使用 jquery,所以我可以利用$.each()$.inArray()这是我想出的解决方案,但似乎应该有更好的方法。

// goal is to get rid of values in y if they exist in x
var x = ["a","b","c","t"];
var y = ["d","a","t","e","g"];

var z = [];
$.each(y, function(idx, value){
  if ($.inArray(value,x) == -1) {
    z.push(value);
  }
});
​alert(z);  // should be ["d","e","g"]

这是正在运行的代码有任何想法吗?

6个回答

在 ES6 中

const a1 = ["a", "b", "c", "t"];
const a2 = ["d", "a", "t", "e", "g"];

console.log( a2.filter(x => !a1.includes(x)) );

(另一种选择是a2.filter(x => a1.indexOf(x)===-1)

新的 ECMA5 javascript 的迟到答案:

var x = ["a","b","c","t"];
var y = ["d","a","t","e","g"];

myArray = y.filter( function( el ) {
  return x.indexOf( el ) < 0;
});
@mikecsh 可能不好。先对两者进行排序,然后再进行排序可能会更好。
2021-04-15 23:58:26
@ccook 你的陈述的证明实际上可能有用。否则只是一个“可能……也许”的句子。
2021-05-03 23:58:26
关于算法复杂性/可扩展性的任何想法?
2021-05-07 23:58:26
var z = $.grep(y, function(el){return $.inArray(el, x) == -1}); 

此外,该方法名称太短了。我希望它表示 isElementInArray,而不是 indexOf。

有关对象的演示,请参阅http://jsfiddle.net/xBDz3/6/

名称 grep 可能会产生误导。它实际上与字符串没有任何关系。它只需要一个谓词。其他语言调用相同的东西过滤器。我做了一个演示
2021-04-18 23:58:26
嗯,我的情况在我的数组中有对象,而不仅仅是简单的字符串。我把字符串放在我的问题中以简化事情。我不确定您的解决方案是否有效。
2021-04-22 23:58:26
注意当前对小提琴代码的支持:JSON.stringify(z)适用于 Chrome 55,其中存在z.toSource()错误。
2021-04-27 23:58:26
哇,经过快速测试,看起来确实有效。命令 grep 具有误导性,因为我假设它可以像 unix 命令一样处理文本。我会再做一些测试。
2021-05-09 23:58:26

这是使用underscore.js的替代方法

function inAButNotInB(A, B) {
  return _.filter(A, function (a) {
    return !_.contains(B, a);
  });
}
我已经摆脱了对 jquery 的依赖,而是使用较小的库,例如下划线和 lodash。这些库使解决像原始问题这样的问题变得更加容易。感谢您提供基于下划线的解决方案!
2021-04-18 23:58:26

这是一个迟到的答案,但它没有使用库,所以有些人可能会觉得它很有帮助。

/**
 * Returns a non-destructive Array of elements that are not found in
 * any of the parameter arrays.
 *
 * @param {...Array} var_args   Arrays to compare.
 */
Array.prototype.uniqueFrom = function() {
  if (!arguments.length)
    return [];
  var a1 = this.slice(0); // Start with a copy

  for (var n=0; n < arguments.length; n++) {
    var a2 = arguments[n];
    if (!(a2 instanceof Array))
      throw new TypeError( 'argument ['+n+'] must be Array' );

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

例子:

var sheetUsers = ['joe@example.com','fred@example.com','sam@example.com'];
var siteViewers = ['joe@example.com','fred@example.com','lucy@example.com'];
var viewersToAdd = sheetUsers.uniqueFrom(siteViewers);  // [sam@example.com]
var viewersToRemove = siteViewers.uniqueFrom(sheetUsers);  // [lucy@example.com]