【问题标题】:Lodash FP flow filter key is undefinedLodash FP 流过滤器键未定义
【发布时间】:2017-02-16 14:11:01
【问题描述】:

我正在尝试采用 Lodash 函数式编程功能并将 _.chain 替换为流。但是,传递到流中的过滤器键是未定义的:

import flow from 'lodash/fp/flow';
import filter from 'lodash/fp/filter';

flow(
  filter((value, key) => console.log(value, key)) // key is undefined
)({ name: "Tobi", year: 2017, });

【问题讨论】:

  • 所以我在下面写了一个很长的答案来描述这里的一些问题,但是你真的想做什么?根据您的输入,您希望输出是什么?
  • 感谢您的详细解答。明天我会分析你的答案。我想做的是从 _.chain 转移到 flow。通常,我使用 _.chain 从响应 JSON 中获取数据的某些特定部分,或者将其重新格式化以可用于某些组件,或者对其进行排序或一起完成所有这些事情。
  • 您可能对我最近关于 Lodash 的 flow 的几个回答感兴趣:Function composition with Lodash flowComposing functions of varying arity using Lodash flow – 如果我能以任何其他方式帮助您,请告诉我^_^跨度>
  • 哇,看起来真的很棒的解释。谢谢

标签: javascript functional-programming lodash


【解决方案1】:

你在这里所做的假设有几个问题


1. Objects 不被视为集合

你的代码基本上是这样做的

// f = your filtering function
filter(f, {name: "Tobi", year: 2017})
// => ["Tobi", 2017]

这是因为filter隐式将对象转换为对象的的数组,如果给定一个对象

要将对象转换为键/值对的数组,请使用 Lodash 的 _.toPairs 函数

_.toPairs({name: "Tobi", year: 2017})
// => [ [ "name", "Tobi" ], [ "year", 2017 ] ]

2。您的过滤功能参数是向后/错误的

即使我们要使用_.toPairs,您的代码也会这样做

_.filter((value, key) => ..., _.toPairs(data),)

不仅顺序倒退,而且查看数据,请注意我们将向过滤函数传递一个 Array[key, value] 对)。这意味着我们必须更新函数以像这样解构元素

_.filter(([key, value]) => console.log(key, value), _.toPairs(data))
// name Tobi
// year 2017
// => []

把它们放在一起

const app = _.flow (
  _.toPairs,
  _.filter(([key, value]) => console.log(key, value)))

app ({name: "Tobi", year: 2017})
// name Tobi
// year 2017
// => []

为什么这仍然很奇怪且毫无意义

对于初学者来说,过滤函数只是执行console.log,所以我们在这里所做的任何事情都没有意义。

我认为 console.log 的目的是查看 filter 是否正常工作,但您必须问自己“过滤对象”到底意味着什么。

  • 您还期待什么样的输出?
  • 我们是否期望返回一个对象?
  • 我们是否希望返回一个键/值对数组?可能不会,但那又怎样? – 或许看看_.fromPairs,它将把 back 对转换为一个对象

不管怎样,一旦你回答了这些问题,也许你会更好地了解如何构建你的程序


合理的猜测?

let isDigit = x => !Number.isNaN(Number(x))

// only keep object assignments where the value is a number
let app = _.flow(
  _.toPairs,
  _.filter(([key, value]) => isDigit(value)),
  _.fromPairs)

app ({name: "Tobi", year: 2017})
// => { year: 2017 }

【讨论】:

  • 最初我没有注意到你在使用lodash/fp——我已经相应地更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
相关资源
最近更新 更多