JS-如何从其他数组中删除数组中的项?

时间:2018-06-23 14:43:05

标签: javascript arrays node.js

我有两个具有以下结构的数组:

  • 数组A:[[1,10],[2,4],[5,22],[3,10]]
  • 数组B:[2,5]

结果数组应为:

  • 数组C:[[1,10],[3,10]]

我正在尝试使用 includes(),但是当我有大数组时,它的速度非常慢。在这种情况下删除项目的最佳解决方案是什么?这是我正在尝试的:

let activeCSs = css.filter(cs => !vacant_css.includes(cs[0]));

3 个答案:

答案 0 :(得分:1)

假设您只想检查内部数组的第一个元素,则可以使用Set进行检查。

var arrayA = [[1, 10], [2, 4], [5, 22], [3, 10]],
    arrayB = [2, 5],
    setB = new Set(arrayB)
    result = arrayA.filter(([v]) => !setB.has(v));

console.log(result);

答案 1 :(得分:0)

另一种方法是使用reduce和filter

var A = [
  [1, 10],
  [2, 4],
  [5, 22],
  [3, 10]
];
var B = [2, 5];
var result = B.reduce((carry, current) => carry.filter(list => !list.includes(current)), A);
console.log(result)

答案 2 :(得分:0)

假设:基于问题中的!vacant_css.includes(cs[0]))代码,将ArrayB中的每个整数与arrayA中包含的每个数组中的第一个整数进行比较。 arrayA[x][y] === arrayB[z]。编码以解决该问题。

海报在评论中提到这是一个练习,所以很不错的选择是他们正在寻找对时间复杂度敏感的解决方案...

我不是O专家,(是的,我听到了),但我认为我的答案最终类似于:O(n log n)+ O(n log n)+ O(n)。我现在还不清楚基于Set的答案会导致大的O。O(n)* O(n)+我认为Set(arrayB)会付出什么代价?

let arrayA = [[1, 10], [2, 4], [5, 22], [3, 10]]
let arrayB = [2, 5]
arrayA.sort((a, b) => a[0] - b[0])
arrayB.sort((a, b) => a - b)

let i = 0
let j = 0
let arrayAnswer = []

while (i<arrayA.length&&j<arrayB.length) {
  let d = arrayA[i][0]-arrayB[j];
  console.log(`i ${i} j ${j} d ${d}`)
  if (d === 0) {
    i++
  } else if (d<0) {
    arrayAnswer.push(arrayA[i])
    i++    
  } else {
    j++
  }
}

console.log(arrayAnswer)

警告:此代码未经特殊情况测试,并且比较老旧。