如何使用Ramda将对象数组转换为数组的数组
使用Ramda实现对象数组的列转置转换
需求描述
我需要用Ramda完成如下数据转换:
输入示例1:
[ { a: 2000, b: 4000 }, { a: 8000, b: 5000 }, { a: 6000, b: 1000 } ];
转换结果1:
[ [ 2000, 8000, 6000 ], [ 4000, 5000, 1000 ] ];
输入示例2:
[ { c: 1000, d: 4000, e: 7000 }, { c: 2000, d: 5000, e: 8000 }, { c: 3000, d: 6000, e: 9000 } ];
转换结果2:
[ [ 1000, 2000, 3000 ], [ 4000, 5000, 6000 ], [ 7000, 8000, 9000 ], ];
核心要求:
- 不能假设对象的键是固定已知的,每次运行键可能变化,但所有对象的键始终一致
- 尽量减少自定义代码,充分利用Ramda提供的函数(我自己能用
R.reduce实现,但想更简洁)
解决方案
可以用Ramda的R.transpose配合R.map(R.values)组合实现,完全依赖内置函数,无需自定义逻辑:
const transform = R.compose(R.transpose, R.map(R.values)); // 测试示例1 const input1 = [ { a: 2000, b: 4000 }, { a: 8000, b: 5000 }, { a: 6000, b: 1000 } ]; console.log(transform(input1)); // 输出:[[2000, 8000, 6000], [4000, 5000, 1000]] // 测试示例2 const input2 = [ { c: 1000, d: 4000, e: 7000 }, { c: 2000, d: 5000, e: 8000 }, { c: 3000, d: 6000, e: 9000 } ]; console.log(transform(input2)); // 输出:[[1000, 2000, 3000], [4000, 5000, 6000], [7000, 8000, 9000]]
逻辑说明
R.map(R.values):遍历输入数组中的每个对象,将其转换为对应的值数组,比如{a:2000, b:4000}会变成[2000, 4000]R.transpose:对转换后的二维数组进行转置,交换行和列的位置,正好得到按原对象键分组的结果数组
这个方案自动适配任意数量的键(只要所有对象键一致),完全符合需求。
内容的提问来源于stack exchange,提问作者user22275934
相关产品推荐
相关产品推荐

