一种更地道的编写避难所管道的方法
A more idiomatic way to write sanctuary pipe
我写了一个提取 source
对象键的代码片段(应该是未知的,所以我添加了一个不存在的键 baz
来提取。
我提取的数组中的每个元素 - 我想添加从中提取它的键,然后将结果展平以获得单个数组。
我在编写代码时遇到了两个主要问题:
- 当尝试使用
S.insert
时,它总是返回错误,因为对象值(数字 {r:**<<number>>**}
)的类型与我尝试添加到键 Section
(例如{'Section': **'foo'**}
)。为了传达我的意图,我最终改变了对象。
- 我没有设法编写一个适当的映射函数来抽象
Maybe
并让我访问其中的变量。所以我不得不使用 S.maybeToNullable
然后将值重新包装成 Maybe
.
- 是否有更好的方式来表达下面用
sanctuary
编写的任何逻辑?
代码片段:
const S = require('sanctuary');
const source = {
foo: [{ r: 1 }, { r: 2 }, { r: 3 }],
bar: [{ r: 4 }, { r: 5 }, { r: 6 }],
}
const result =
S.pipe([
S.map(
prop => {
const nullable = S.maybeToNullable(S.value(prop)(source))
return nullable ? S.Just(nullable.map(val => {val['Section'] = prop; return val})) : S.Nothing
}
),
S.justs,
S.reduce(xs => x => [...xs, ...x])([])
])(['foo', 'bar', 'baz'])
这是我的解决方案:
const S = require ('sanctuary');
// source :: StrMap (Array { r :: Integer })
const source = {
foo: [{r: 1}, {r: 2}, {r: 3}],
bar: [{r: 4}, {r: 5}, {r: 6}],
quux: [{r: 7}, {r: 8}],
};
// result :: Array { r :: Integer, Section :: String }
const result =
S.filter (S.compose (S.flip (S.elem) (['foo', 'bar', 'baz']))
(S.prop ('Section')))
(S.chain (S.pair (s => S.map (S.unchecked.insert ('Section') (s))))
(S.pairs (source)));
有几点需要注意:
我写了一个提取 source
对象键的代码片段(应该是未知的,所以我添加了一个不存在的键 baz
来提取。
我提取的数组中的每个元素 - 我想添加从中提取它的键,然后将结果展平以获得单个数组。
我在编写代码时遇到了两个主要问题:
- 当尝试使用
S.insert
时,它总是返回错误,因为对象值(数字{r:**<<number>>**}
)的类型与我尝试添加到键Section
(例如{'Section': **'foo'**}
)。为了传达我的意图,我最终改变了对象。 - 我没有设法编写一个适当的映射函数来抽象
Maybe
并让我访问其中的变量。所以我不得不使用S.maybeToNullable
然后将值重新包装成Maybe
. - 是否有更好的方式来表达下面用
sanctuary
编写的任何逻辑?
代码片段:
const S = require('sanctuary');
const source = {
foo: [{ r: 1 }, { r: 2 }, { r: 3 }],
bar: [{ r: 4 }, { r: 5 }, { r: 6 }],
}
const result =
S.pipe([
S.map(
prop => {
const nullable = S.maybeToNullable(S.value(prop)(source))
return nullable ? S.Just(nullable.map(val => {val['Section'] = prop; return val})) : S.Nothing
}
),
S.justs,
S.reduce(xs => x => [...xs, ...x])([])
])(['foo', 'bar', 'baz'])
这是我的解决方案:
const S = require ('sanctuary');
// source :: StrMap (Array { r :: Integer })
const source = {
foo: [{r: 1}, {r: 2}, {r: 3}],
bar: [{r: 4}, {r: 5}, {r: 6}],
quux: [{r: 7}, {r: 8}],
};
// result :: Array { r :: Integer, Section :: String }
const result =
S.filter (S.compose (S.flip (S.elem) (['foo', 'bar', 'baz']))
(S.prop ('Section')))
(S.chain (S.pair (s => S.map (S.unchecked.insert ('Section') (s))))
(S.pairs (source)));
有几点需要注意: