如何在JavaScript中以lodash的环绕样式构建过滤器链?

时间:2018-08-20 14:46:33

标签: javascript lodash ecmascript-7

要清楚,给定一个对象数组,可能具有同一个键:

const data = [
  { name: "tomato", isHealthy: true, "calories": 300 },
  { name: "french fries", isHealthy: false, "calories": 1000 },
  { name: "lettuce", isHealthy: true, "calories": 100 },
  { name: "nacho cheese", isHealthy: false, "calories": 1200 },
  { name: "boring chicken", isHealthy: true, "calories": 500 },
];

和一些过滤器说:

const isHealthy = function(items) {
  return items.filter(i => i.isHealthy);
};

const caloriesAbove = function(items, calories) {
  return items.filter(i => i.calories > calories);
};

我希望能够像这样调用过滤器链:

wrapper(data).isHealthy().caloriesAbove(500).value.map(...)

要知道lodash如何做到这一点有点困难。此外,是否有一种方法可以这样做,而不必显式地展开以获取值?这不是必需的,因为我认为这可能必须使用不良的黑客手段。

2 个答案:

答案 0 :(得分:5)

这是lodash的工作方式:

k
  

此外,是否有一种方法可以执行此操作,而无需显式地进行包装以获得值?

自ES6起,您可以扩展数组:

 function wrapper(items) {
    return {
        value: items,
        isHealthy() { 
          return wrapper(items.filter(it => it.isHealthy));
        },
        caloriesAbove(calories) {
          return wrapper(items.filter(it => it.calories > calories));
        },
    };
 }

要将现有的数组转换为项,只需执行 class Items extends Array { isHealthy() { return this.filter(it => it.isHealthy); } } Items.from(array),即可:

new Items(...array)

答案 1 :(得分:0)

我阅读了答案,我喜欢@Jonas所做的方式。不知道您可以像这样简单地扩展Array。防御得到我的支持!

话虽这么说,我想知道当您可以简单地创建一个过滤器函数来处理多个值并将其传递给数组的过滤器时,这种方法有多大用处:

SELECT *
    FROM EVENTS
    WHERE event_date >= CURDATE() ORDER BY event_date ASC  LIMIT 3;

我在一个更通用的视图中看到了此方法的价值,但是对于过滤而言,这似乎有点矫kill过正。

只需2美分。