You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:57:29