0

我正在解决一个函数array_diff返回数组中的值的问题,这些值a也在数组中b

因为我一直在学习命名函数表达式比匿名胖箭头函数更适合控制台调试,所以我试图用命名removeDuplicate函数来过滤我的数组来解决这个问题。

但是,我无法阻止过滤器函数自动从返回的数组中删除错误值 0。

命名函数表达式:

function array_diff(a, b) {
  return a.filter(function removeDuplicate(x) { if(b.indexOf(x) == -1) return x; });
}

array_diff([0,1,2,3,4],[2,4]); // [1, 3]

匿名胖箭头功能:

function array_diffTwo(a, b) {
  return a.filter((x) => { return b.indexOf(x) == -1 });
}

array_diffTwo([0,1,2,3,4],[2,4]); // [0, 1, 3]

有人可以向我解释为什么 falsey 值 0 被删除array_diff而不是array_diffTwo

4

2 回答 2

2

问题是你return x从过滤器回调。如果(被迭代的项目)是假的,即使测试完成x,结果也不会包含在最终数组中。b.indexOf(x) == -1

用较低的代码做同样的事情:

return b.indexOf(x) == -1

function array_diff(a, b) {
  return a.filter(function removeDuplicate(x) { return b.indexOf(x) === -1 });
}

console.log(array_diff([0,1,2,3,4],[2,4])); // [0, 1, 3]

(作为旁注,您没有在代码中的任何地方使用箭头函数)

您可以通过创建 Set ofO(n ^ 2)来降低计算复杂度,而不是在每次迭代时检查s :O(n)bindexOf

function array_diff(a, b) {
  const bSet = new Set(b);
  return a.filter(function removeDuplicate(x) { return !bSet.has(x); });
}

console.log(array_diff([0,1,2,3,4],[2,4])); // [0, 1, 3]

于 2020-01-28T05:59:47.420 回答
0

你误解了array.filter( callback)。callback应该是一个谓词,在您为要保留的元素返回的回调中truefalse对于元素,not the element. 当您返回元素本身时,这就是删除虚假元素的原因。

另外,箭头函数应该是这样的

array_diff =(a,b)=>a.filter(x=>b.indexOf(x)<0)
console.log(array_diff([0,1,2,3,4],[2,4]))

于 2020-01-28T06:21:12.070 回答