如何使用Array.prototype.filter方法在Express应用程序中模拟lodash .find方法

我正在通过使用Express学习APIdevise的一个很好的课程 。

app.get('/lions/:id', function(req, res){ var lion = _.find(lions, {id: req.params.id}); res.json(lion || {}); }); 

无论如何,我注意到教练使用lodash进行一些数据操作,并试图用香草Array.prototype.filter方法做同样的事情

 app.get('/lions/:id', function(req, res){ var lion = lions.filter(function(id){ return {id: req.params.id} }); res.json(lion || {}); }); 

我只是回来一个空arrays… []

任何帮助将不胜感激!

FIND方法获得满足expression式的第一个元素为TRUE。 FILTER将返回符合expression式的任何项目作为TRUE。

 app.get('/lions/:id', function(req, res){ var lion = lions.filter(function(id){ return id === req.params.id; }); res.json(lion || {}); }); 

对于Native JS FIND方法,较老的浏览器存在polyfill 。 findPolyfill链接

filter方法如何工作…

 var numbers = [9,3,5,0,-1]; var result = numbers.filter(function(num){ return num; }); // result => [9,3,5,-1]; zero is falsey. // Filter does not return the actual number, only if the result is truthey. 

**更新**

 // So returning something like **{id: req.params.id}** is always truthy // because an object is true !!{} === true; => TRUE. // Even if {id: undefined}; // Also, note that the filter function passed everything into the new array that was truthy, // which is NOT what **FIND** does. 

请注意三重(===)就是我如何根据平等比较(STRICT)进行比较

在原始答案中,我的数据排列方式不正确。 另外,如果你想实际build立自己的FIND方法,这也许更多的是你所要求的,那么下面的例子就可以工作。

 var lions = [{id: 2, name: "blue"}, {id: 4, name: "green"}, {id:8, name: "red"}, {id: 2, name: "yellow"}]; app.get('/lions/:id', function(req, res){ res.json(lions[lions.map(ids).indexOf(req.params.id)] || {}); }); // Helper Functions function ids(lion){ return lion.id; } 
 app.get('/lions/:id', function(req, res) { var lion = lions.filter(function(lion) { return lion.id == req.params.id }); res.json(lion || {}); });