2017-08-12 78 views
1

我尝试做一个拒绝功能的阵列中找到了丢失的值: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的第一个值。 为什么会发生这种情况,以及如何解决它?

回答

2

store.find返回找到的元素。如果这是0,则iteratorFunction将返回0,而!0true,因为0是虚假的。

使用Array#includes正确的存在检查更是简洁,虽然:

var missingValues = reject(fullArray, function (number) { 
    return store.includes(number); 
}); 
0

你也可以做的更简洁的方式如下:

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)

运行