【问题标题】:How to emulate lodash .find method in a Express app with Array.prototype.filter method如何使用 Array.prototype.filter 方法在 Express 应用程序中模拟 lodash .find 方法
【发布时间】:2017-10-31 04:52:27
【问题描述】:

我正在通过great course learning API design with Express 工作。

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

无论如何,我注意到讲师使用 lodash 进行了一些数据操作,并尝试尝试对 vanilla Array.prototype.filter method 进行相同操作

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

我只是返回一个空数组...[]

任何帮助将不胜感激!

【问题讨论】:

  • 仅供参考 Array.prototype.find 也是本机方法。
  • @pawel Oui!谢谢我的朋友!
  • 了解流行库如何工作的一个好方法是查看它的源代码。这是 lodash 的find

标签: javascript arrays node.js express


【解决方案1】:
app.get('/lions/:id', function(req, res) {
    var lion = lions.filter(function(lion) {
        return lion.id == req.params.id
    });
    res.json(lion || {});
});

【讨论】:

  • 我认为要使用filter 完全模拟find,您需要返回lion[0],因为过滤器会返回一个数组,而不是通过测试的第一个元素。
【解决方案2】:

FIND 方法将满足表达式的第一个元素设为 TRUE。 FILTER 会将满足表达式的任何项目返回为 TRUE。

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

针对旧版浏览器的原生 JS FIND 方法存在一个 polyfill。 FIND Polyfill Link

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.

请注意,三元组 (===) 就是我现在按照以下方式进行任何比较的方式 Equality Comparison (STRICT)

在原始答案中,我的数据排列方式不正确。此外,如果您想实际构建自己的 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;
}

【讨论】:

  • @SoExPz 我很困惑。在过滤器中不会说return lion.id == req.params.id 就足够了,因为当您转到路线的参数并输入一个数字时,它只会返回该对象的ID?或者如果没有找到空对象....
  • 非常感谢@SoEzPz!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多