Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中获取两个数组的子集?_Javascript_Arrays - Fatal编程技术网

如何在javascript中获取两个数组的子集?

如何在javascript中获取两个数组的子集?,javascript,arrays,Javascript,Arrays,我想做的是如果我有数组 a={1,2,3,4}; b={1,2} 然后我想要子集数组为c={3,4} 有人能帮我吗?我不知道有什么内置的方法可以做到这一点,你基本上必须在c中循环,检查每个元素是否在a中,如果是的话,将其删除。该方法可以帮助您进行检查,但并非所有实现都有它(尽管大多数实现都有)。可通过以下方式移除 因此: …然后,如果您的环境不支持,您可以提供自己的Array#indexOf实现,或者使用这样的库为您提供它(jQuery也提供了它,但通过它自己的函数)。如果你自己做: if (!

我想做的是如果我有数组 a={1,2,3,4}; b={1,2}

然后我想要子集数组为c={3,4}


有人能帮我吗?

我不知道有什么内置的方法可以做到这一点,你基本上必须在
c
中循环,检查每个元素是否在
a
中,如果是的话,将其删除。该方法可以帮助您进行检查,但并非所有实现都有它(尽管大多数实现都有)。可通过以下方式移除

因此:

…然后,如果您的环境不支持,您可以提供自己的
Array#indexOf
实现,或者使用这样的库为您提供它(jQuery也提供了它,但通过它自己的函数)。如果你自己做:

if (!Array.prototype.indexOf) {
  (function() {
    Array.prototype.indexOf = Array_indexOf;
    function Array_indexOf(elm) {
      var index;
      for (index = 0; index < this.length; ++index) {
        if (this[index] === elm) {
          return index;
        }
      }
      return -1;
    }
  })();
}
if(!Array.prototype.indexOf){
(功能(){
Array.prototype.indexOf=数组_indexOf;
函数数组_indexOf(elm){
var指数;
对于(索引=0;索引
请注意,如果使用编写得不好、对环境做出假设的代码,则如上所述添加到
阵列
原型可能会很危险。具体来说,如果将
添加到
数组
原型中,则将
for..视为在数组元素索引中循环的代码(它不会,它会查看对象属性名称)将变得混乱。(这可能就是jQuery不这么做的原因。)


假设您在
a
中查找
b
的相对补码

function complement(a, b) {

  // convert A to an associative array
  var myHash = {};
  for (var i = 0; i < a.length; ++i) {
    myHash[a[i]] = 1;
  }

  // remove the elements that exist in B
  for (var i = 0; i < b.length; ++i) {
    delete myHash[b[i]];
  }

  // what's left is A \ B
  // assumes that no-one broke Array by adding new properties to the prototype
  return Object.keys(myHash);
}

// test
var a = [1, 2, 3, 4];
var b = [1, 2];
var c = complement(a, b);
alert(c);
函数补码(a,b){
//将阵列转换为关联阵列
var myHash={};
对于(变量i=0;i
对于较大的数组,这应该可以很好地扩展,因为它使用哈希表索引而不是线性搜索来删除不需要的元素。

a=[1,2,3,4]
a = [1, 2, 3, 4]
b = [2, 1, 5]

comp = a.filter(function(e) { return b.indexOf(e) < 0 })
b=[2,1,5] comp=a.filter(函数(e){返回b.indexOf(e)<0})

有关更多详细信息和降级选项,请参阅和。

这里是另一个使用和的解决方案


请澄清你的术语。在您的示例中,
c
确实是
a
的一个子集,但是您没有指出为什么这是您想要的特定子集。您是否可能是
a
b
的相对补充,即
b\a
?为什么将indexOf的定义放在闭包中而不是像这样:if(!Array.prototype.indexOf){Array.prototype.indexOf=function(elm){…};}@thomasmalt:因为我喜欢函数有名称,不幸的是,这是唯一一种与IE(JScript)兼容的方法,可以在不创建全局符号的情况下为函数命名,如果不需要的话,也可以不创建函数:除了函数没有名称之外,你的方法很棒。谢谢。我通常更喜欢通过为变量分配匿名函数来扩展。对我来说,这增强了可读性,并使创建格式良好、文档完整的源代码变得容易。:)@托马斯马特:很公平。在使用调试器时,我希望调用堆栈中有函数名。:-)希望有一天,微软能修复JScript的错误,防止只使用像
Array.prototype.indexOf=function Array\u indexOf(){…}
这样的命名函数表达式。但遗憾的是,甚至连JScript 6(IE8)都无法修复它:也许IE9,他们正在做大量的标准工作……而调试是使用命名函数的一个很好的理由。感谢您的提示。当(某些)数组元素是对象时,基于哈希的解决方案不起作用。
a = [1, 2, 3, 4]
b = [2, 1, 5]

comp = a.filter(function(e) { return b.indexOf(e) < 0 })
function arrayDifference(a, b) {
  return a.filter((x) => !b.includes(x));
}

const a = [1, 2, 2, 2, 3, 4]
const b = [1, 2]

arrayDifference(a,b) // returns [3, 4]