Lodash FP流量过滤器键未定义

时间:2017-02-16 14:11:01

标签: javascript functional-programming lodash

我正在尝试采用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, });

1 个答案:

答案 0 :(得分:3)

<强>金! Das tut weh!

好吧,看起来你做错了。关于你在这里做出的假设你有几个问题

<强> 1。 Object不被视为集合

您的代码基本上就是这样做

// 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]对)传递给过滤功能。这意味着我们必须将函数更新为 destructure 元素,如此

_.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是否正常工作,但你必须问自己“过滤对象”的意义。

  • 你甚至期待什么样的输出?
  • 我们期待返回一个Object吗?
  • 我们是否希望返回一组键/值对?可能不是,但接着是什么? - 也许看看_.fromPairs会将转换为对象

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

明智的猜测?

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 }