我正在尝试采用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, });
答案 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
是否正常工作,但你必须问自己“过滤对象”的意义。
_.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 }