JavaScript的过滤器缺阵
问题描述:
我尝试做一个拒绝功能的阵列中找到了丢失的值:JavaScript的过滤器缺阵
var store = [0,1,2,3,4,5,6,7,8,15,16,18,20,21];
var fullArray= [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];
function reject(array, iteratorFunction) {
return array.filter(function(element) {
return !iteratorFunction(element)});
}
var missingValues = reject(fullArray, function(number){
return store.find(function(item){return number === item});
});
console.log(missingValues);
,但我的结果表明:
[0,9,10,11,12,13,14,17,19]
我展示一个0的第一个值。 为什么会发生这种情况,以及如何解决它?
答
store.find
返回找到的元素。如果这是0
,则iteratorFunction
将返回0
,而!0
为true
,因为0
是虚假的。
使用Array#includes
正确的存在检查更是简洁,虽然:
var missingValues = reject(fullArray, function (number) {
return store.includes(number);
});
答
你也可以做的更简洁的方式如下:
var store = [0,1,2,3,4,5,6,7,8,15,16,18,20,21],
fullArray = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],
result = fullArray.filter(n => !store.includes(n));
console.log(result);
然而,这会在O(牛米),以便更有效的方式将是运行;
var store = [0,1,2,3,4,5,6,7,8,15,16,18,20,21],
fullArray = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],
result = fullArray.reduce((t,m) => (!t[m] && t.r.push(m),t), store.reduce((h,n) => (h[n] = true,h),{r:[]})).r;
console.log(result);
这在O(N + M)
运行