如何使用 Ramda 将对象数组转换为数组数组

问题描述 投票:0回答:1

我想改变这个:

[
  { a: 2000, b: 4000 },
  { a: 8000, b: 5000 },
  { a: 6000, b: 1000 }
];

进入此:

[
  [ 2000, 8000, 6000 ],
  [ 4000, 5000, 1000 ]
];

使用 Ramda。

我可以只使用 R.reduce 来做到这一点,但我想知道是否有一种方法可以使用尽可能少的自定义代码,而是充分利用 Ramda 提供的功能。

还有一个警告;该解决方案不能假设对象中的键是已知的。它们在对象之间始终保持一致,但每次运行此函数时可能会发生变化。例如,代码的下一次运行可能是:

输入:

[
  { c: 1000, d: 4000, e: 7000 },
  { c: 2000, d: 5000, e: 8000 },
  { c: 3000, d: 6000, e: 9000 }
];

结果:

[
  [ 1000, 2000, 3000 ],
  [ 4000, 5000, 6000 ],
  [ 7000, 8000, 9000 ],
];

javascript arrays javascript-objects ramda.js
1个回答
0
投票

只需使用 vanilla JS 并转置映射的对象值。

const transpose = (a) => a[0].map((_, i) => a.map(r => r[i]));

{
  const
    input = [
      { a: 2000, b: 4000 },
      { a: 8000, b: 5000 },
      { a: 6000, b: 1000 }
    ],
    expected = [
      [ 2000, 8000, 6000 ],
      [ 4000, 5000, 1000 ]
    ],
    actual = transpose(input.map(Object.values));

  console.log(JSON.stringify(actual) === JSON.stringify(expected));
}

{
  const
    input = [
      { c: 1000, d: 4000 },
      { c: 2000, d: 5000 },
      { c: 3000, d: 6000 }
    ],
    expected = [
      [ 1000, 2000, 3000 ],
      [ 4000, 5000, 6000 ]
    ],
    actual = transpose(input.map(Object.values));

  console.log(JSON.stringify(actual) === JSON.stringify(expected));
}

© www.soinside.com 2019 - 2024. All rights reserved.