我有两个具有以下结构的数组:
结果数组应为:
我正在尝试使用 includes(),但是当我有大数组时,它的速度非常慢。在这种情况下删除项目的最佳解决方案是什么?这是我正在尝试的:
let activeCSs = css.filter(cs => !vacant_css.includes(cs[0]));
答案 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)
警告:此代码未经特殊情况测试,并且比较老旧。