2016-06-24 47 views
0

我想过滤使用另一个数组值的对象数组,但我得到一个空列表。下面是我的代码基于另一个数组值过滤对象数组,返回一个空列表

[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}].filter(function(val){ 
     [1,2,3].forEach(function(id){ 
      if(id == val.id){ 
       return true; 
      } 
     }); 
    }); 

我的疑问是

1)这似乎是内部的foreach回调函数犯规返回boolean值滤波器的父回调函数。有没有办法做到这一点?

+0

@squint我想的foreach返回冒泡到过滤器的恢复。现在我的错误 – MeanMan

+0

这是一个常见的错误,但没有。如果确实如此,它会有停止调用堆栈中的所有功能的副作用,这通常是不希望的。 –

回答

0

您的过滤器函数没有返回任何内容,因此undefined实际上是false,这意味着它从列表中排除。您的return声明仅从forEach回调中返回。

使用.some()而不是.forEach(),并在其之前放置return语句。

[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}].filter(function(val){ 
    return [1,2,3].some(function(id){ 
     if(id == val.id){ 
      return true; 
     } 
    }); 
}); 

.some()方法返回true如果至少1调用回调返回truthy值。只要返回真值,它也会停止迭代。


仅供参考,您可以通过删除if声明将其缩短一点。

[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}].filter(function(val){ 
    return [1,2,3].some(function(id){ 
     return id == val.id 
    }); 
}); 

或使用新箭头函数的语法,甚至更多。

[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}] 
    .filter((val) => [1,2,3].some((id) => id == val.id)); 

或者因为你不需要任何复杂的逻辑做比较,你可以使用ES7 .includes()方法,它返回基于严格的平等比较的布尔结果。

[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}] 
    .filter(function(val) { return [1,2,3].includes(val.id) }); 

[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}] 
    .filter((val) => [1,2,3].includes(val.id)); 

有一个在链接的文档一个填充工具来修补这还没有.indcludes()旧的实现。

0
[{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}].filter(function(val){ 
     var returnValue = false; 
     [1,2,3].forEach(function(id){ 
      if(id == val.id){ 
       returnValue = true; 
      } 
     }); 
     return returnValue; 
    }); 
0

有使用Array.filterArray.indexOf功能更简单的方法:

var arr = [{'id':1,name:'x1'},{'id':2,name:'x2'},{'id':3,name:'x3'}]; 

arr = arr.filter(function(val){ 
    return [1,2,3].indexOf(val.id) !== -1; 
}); 

console.log(JSON.stringify(arr, 0, 4)); 

输出:

[ 
    { 
     "id": 1, 
     "name": "x1" 
    }, 
    { 
     "id": 2, 
     "name": "x2" 
    }, 
    { 
     "id": 3, 
     "name": "x3" 
    } 
] 
+0

同意这是最好的和简单的选择,我怀疑是否返回forEach回调达到过滤器回调,@斜视的评论和mohit的答案清除了我的疑惑。 – MeanMan

相关问题