卡在 Ramda 组合上
Stuck on Ramda composition
我正在尝试将以下输入(JSON 的数组)转换为如下所示的预期输出。 indexCols 也是
var objects = ['{"ticker":"MSFT", "key": 2, "PX_LAST":100}',
'{"ticker":"AAPL", "key": 3, "PX_LAST":100}',
'{"ticker":"GOOG", "key": 4, "PX_LAST":100}']
/* Expected output
[[id, '{"ticker":"MSFT", "key": 2, "PX_LAST":100}', 'MSFT', 2 ]
[id, '{"ticker":"AAPL", "key": 3, "PX_LAST":100}', 'AAPL', 3 ]
[id, '{"ticker":"GOOG", "key": 4, "PX_LAST":100}', 'GOOG', 4 ]]
*/
var indexCols = ['ticker', 'key']
var transform = function(input, indexCols, id) {
var fn2 = R.compose(R.flip(R.map)(indexCols), R.flip(R.prop), JSON.parse)
var fn3 = R.map(R.compose(R.concat([id]), fn2))
return fn3(objects)
}
transform(objects, indexCols, 100)
/* result : [[100, "MSFT", 2], [100, "AAPL", 3], [100, "GOOG", 4]] */
如您所见,结果数组缺少第二个元素,即 json 字符串。我无法以实用的方式编织它。
(我认为有一个错字,而不是这个:return fn3(objects) 你可能是这个意思:return fn3(input) )
var transform = function(input, indexCols, id) {
var fn2 = R.compose(R.flip(R.map)(indexCols), R.flip(R.prop), JSON.parse);
var valueToArray = R.flip(R.append)([]);
var fn3 = R.map(R.compose(R.flatten, R.concat([id]), R.compose(R.ap([R.identity, fn2]), valueToArray)))
return fn3(input)
}
https://codepen.io/anon/pen/Jrzmda
你必须复制你的输入对象(a->[a,a]),然后你可以随意操作第二个元素(fn2),只需要保持第一个元素不变(身份),并且,最后,将它们连接在一起。
改进 1:是否已有用于 valueToArray ( a->[a] ) 的 Ramda 函数?
改进 2:有没有办法连接 id not nested 以摆脱 R.flatten?
您可以使用 R.converge
这样您就可以将字符串提供给 concat 和 JSON.parse:
var objects = ['{"ticker":"MSFT", "key": 2, "PX_LAST":100}',
'{"ticker":"AAPL", "key": 3, "PX_LAST":100}',
'{"ticker":"GOOG", "key": 4, "PX_LAST":100}']
/* Expected output
[[id, '{"ticker":"MSFT", "key": 2, "PX_LAST":100}', 'MSFT', 2 ]
[id, '{"ticker":"AAPL", "key": 3, "PX_LAST":100}', 'AAPL', 3 ]
[id, '{"ticker":"GOOG", "key": 4, "PX_LAST":100}', 'GOOG', 4 ]]
*/
var indexCols = ['ticker', 'key']
var transform = function(input, indexCols, id) {
//Have to trick R.converge into making it think that JSON.parse only has 1 argument
var fn2 = R.compose(R.flip(R.map)(indexCols), R.flip(R.prop), R.curryN(1, JSON.parse))
var fn3 = R.map(R.compose(R.concat([id]), R.converge(R.concat, [Array, fn2])))
return fn3(input) //typo shouldn't be objects
}
console.log(transform(objects, indexCols, 100))
/* result : [[100, "MSFT", 2], [100, "AAPL", 3], [100, "GOOG", 4]] */
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
另一种方法是使用:
R.ap(R.compose(R.concat, Array), fn2))
// concat <$> Array <*> fn2
// R.liftN(2, R.concat)(Array, fn2) is the same
而不是:
R.converge(R.concat, [Array, fn2])
这样你就不会 运行 进入 R.converge
猜测 JSON.parse
有 2 个参数的问题。
这些看起来不必要地复杂...
怎么样:
const objects = ['{"ticker":"MSFT", "key": 2, "PX_LAST":100}',
'{"ticker":"AAPL", "key": 3, "PX_LAST":100}',
'{"ticker":"GOOG", "key": 4, "PX_LAST":100}']
const indexCols = ['ticker', 'key', 'PX_LAST']
const pickIndeces = pipe(JSON.parse, props(indexCols))
const format = map(x => concat([x], pickIndeces(x)))
format(objects)
注意,pipe
、props
、concat
和 map
是 Ramda 函数。所以你可以像这样导入它们:
const { concat, map, pipe, props } = R
我正在尝试将以下输入(JSON 的数组)转换为如下所示的预期输出。 indexCols 也是
var objects = ['{"ticker":"MSFT", "key": 2, "PX_LAST":100}',
'{"ticker":"AAPL", "key": 3, "PX_LAST":100}',
'{"ticker":"GOOG", "key": 4, "PX_LAST":100}']
/* Expected output
[[id, '{"ticker":"MSFT", "key": 2, "PX_LAST":100}', 'MSFT', 2 ]
[id, '{"ticker":"AAPL", "key": 3, "PX_LAST":100}', 'AAPL', 3 ]
[id, '{"ticker":"GOOG", "key": 4, "PX_LAST":100}', 'GOOG', 4 ]]
*/
var indexCols = ['ticker', 'key']
var transform = function(input, indexCols, id) {
var fn2 = R.compose(R.flip(R.map)(indexCols), R.flip(R.prop), JSON.parse)
var fn3 = R.map(R.compose(R.concat([id]), fn2))
return fn3(objects)
}
transform(objects, indexCols, 100)
/* result : [[100, "MSFT", 2], [100, "AAPL", 3], [100, "GOOG", 4]] */
如您所见,结果数组缺少第二个元素,即 json 字符串。我无法以实用的方式编织它。
(我认为有一个错字,而不是这个:return fn3(objects) 你可能是这个意思:return fn3(input) )
var transform = function(input, indexCols, id) {
var fn2 = R.compose(R.flip(R.map)(indexCols), R.flip(R.prop), JSON.parse);
var valueToArray = R.flip(R.append)([]);
var fn3 = R.map(R.compose(R.flatten, R.concat([id]), R.compose(R.ap([R.identity, fn2]), valueToArray)))
return fn3(input)
}
https://codepen.io/anon/pen/Jrzmda
你必须复制你的输入对象(a->[a,a]),然后你可以随意操作第二个元素(fn2),只需要保持第一个元素不变(身份),并且,最后,将它们连接在一起。
改进 1:是否已有用于 valueToArray ( a->[a] ) 的 Ramda 函数? 改进 2:有没有办法连接 id not nested 以摆脱 R.flatten?
您可以使用 R.converge
这样您就可以将字符串提供给 concat 和 JSON.parse:
var objects = ['{"ticker":"MSFT", "key": 2, "PX_LAST":100}',
'{"ticker":"AAPL", "key": 3, "PX_LAST":100}',
'{"ticker":"GOOG", "key": 4, "PX_LAST":100}']
/* Expected output
[[id, '{"ticker":"MSFT", "key": 2, "PX_LAST":100}', 'MSFT', 2 ]
[id, '{"ticker":"AAPL", "key": 3, "PX_LAST":100}', 'AAPL', 3 ]
[id, '{"ticker":"GOOG", "key": 4, "PX_LAST":100}', 'GOOG', 4 ]]
*/
var indexCols = ['ticker', 'key']
var transform = function(input, indexCols, id) {
//Have to trick R.converge into making it think that JSON.parse only has 1 argument
var fn2 = R.compose(R.flip(R.map)(indexCols), R.flip(R.prop), R.curryN(1, JSON.parse))
var fn3 = R.map(R.compose(R.concat([id]), R.converge(R.concat, [Array, fn2])))
return fn3(input) //typo shouldn't be objects
}
console.log(transform(objects, indexCols, 100))
/* result : [[100, "MSFT", 2], [100, "AAPL", 3], [100, "GOOG", 4]] */
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
另一种方法是使用:
R.ap(R.compose(R.concat, Array), fn2))
// concat <$> Array <*> fn2
// R.liftN(2, R.concat)(Array, fn2) is the same
而不是:
R.converge(R.concat, [Array, fn2])
这样你就不会 运行 进入 R.converge
猜测 JSON.parse
有 2 个参数的问题。
这些看起来不必要地复杂...
怎么样:
const objects = ['{"ticker":"MSFT", "key": 2, "PX_LAST":100}',
'{"ticker":"AAPL", "key": 3, "PX_LAST":100}',
'{"ticker":"GOOG", "key": 4, "PX_LAST":100}']
const indexCols = ['ticker', 'key', 'PX_LAST']
const pickIndeces = pipe(JSON.parse, props(indexCols))
const format = map(x => concat([x], pickIndeces(x)))
format(objects)
注意,pipe
、props
、concat
和 map
是 Ramda 函数。所以你可以像这样导入它们:
const { concat, map, pipe, props } = R