【问题标题】:Performing Set calculations in javascript array在 javascript 数组中执行集合计算
【发布时间】:2014-12-23 15:20:07
【问题描述】:

我有 2 个数组可以说:

A = [1,2,3,4,5] and B = [1,2,3,6,7]

我想执行以下“集合计算”:

C = (A ∩ B)
D = A - (A ∩ B)
E = B - (A ∩ B)

基本上:

C = [1,2,3]
D = [4,5]
E = [6,7]

有没有一种聪明的方法可以做到这一点,还是我必须用循环和 if 交叉检查每个数组成员?我无法使用外部库(如 math.js 或 w/e)。

提前致谢。

【问题讨论】:

  • 由于您不能使用外部库,看来您将不得不依赖大量原始 for 循环或编写自己的小型库。无论哪种方式,您都将使用 for 循环。希望这不是家庭作业。
  • 不,这不是家庭作业,它与工作有关,我不想仅仅为了 3 行代码就将整个外部库添加到我们的 SVN 项目中。我可以想办法得到我想要的结果我只是想在这里要求一个更优雅的解决方案。另外,我以前不需要对数组使用集合论,所以我认为在这里学习一些东西以备后用是个好主意。

标签: javascript arrays union intersection set-theory


【解决方案1】:

filter() 至少可以为您隐藏循环:

A = [1,2,3,4,5];
B = [1,2,3,6,7];

C = intersection(A, B);
D = arrayDiff(A, C);
E = arrayDiff(B, C);

console.log(JSON.stringify(C));
console.log(JSON.stringify(D));
console.log(JSON.stringify(E));

function intersection(a, b) {
  return a.filter( 
    function(el) {
      return b.indexOf(el) >= 0;
    }
  );
}

function arrayDiff(a, b) {
  return a.filter( 
    function(el) {
      return b.indexOf(el) < 0;
    }
  );
}

【讨论】:

  • 这样的时候我很感激被证明是错误的。
【解决方案2】:

从 ES6 开始,Javascript 有一个 inbuilt set object,它提供了执行上述操作的简洁方法。

var intersection = function(setA, setB){
  return new Set([x for (x of setA) if (setB.has(x))]);
}
var difference = function(setA, setB){
  return new Set([x for (x of setA) if (!setB.has(x))]);
}
A = new Set([1,2,3,4,5]);
B = new Set([1,2,3,6,7]);

// A ∩ B = ([1,2,3])
intersection(A, B);

// A \ B = ([4,5])
difference(A, B);

// B \ A = ([6,7])
difference(B, A);

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多