【问题标题】:JS - How to remove items from Array that are present on other Array?JS - 如何从数组中删除其他数组中存在的项目?
【发布时间】:2018-06-23 14:43:04
【问题描述】:

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

  • 数组 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]));

【问题讨论】:

  • 将第二个数组转换为Set
  • 你的数组一定很大! A 和 B 都大还是其中一个比另一个大得多?
  • @FelixKling 将数组 B 转换为 Set?
  • @LuanNico 可能相当大..我没有案例测试来查看大小,因为这是hackerrank 的练习
  • 要检查的数组是否包含值。

标签: javascript arrays node.js


【解决方案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);

【讨论】:

  • 不清楚 op 是否真的需要检查每个元素。但除此之外,使用集合将内部检查的复杂性从 O(n^2) 降低到 O(n)
【解决方案2】:

另一种方法是使用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)

【讨论】:

    【解决方案3】:

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

    cmets 中的海报提到这是来自练习,所以很好打赌他们正在寻找时间复杂度敏感的解决方案......

    我不是 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)
    

    警告:此代码未针对极端情况进行测试,而且很老套。

    【讨论】:

      猜你喜欢
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2014-07-19
      • 2016-09-07
      • 1970-01-01
      相关资源
      最近更新 更多