将 Pair 数组转换为 2 个单独的数组而不进行迭代

ane*_*gib 3 javascript arrays object

我有一系列看起来像这样的对[[x,y], [x,y] ... ]。我想将其格式化为一个对象,其中值是 x 和 y 值的数组,如下所示{keys: [x1, x2, x3 ...], values: [y1, y2, y3 ... ]}

是否有任何数组/对象操作可以完成此操作而无需迭代原始列表?

Ori*_*ori 5

最简单、最安全的方法是将数组简化为对象,尽管它需要循环:

const input = [[3, 300], [2, 200], [1, 100]];

const result = input.reduce((acc, [key, val]) => {
  acc.keys.push(key);
  acc.values.push(val);
  
  return acc;
}, { keys: [], values: [] });

console.log(result);
Run Code Online (Sandbox Code Playgroud)

我实际上不会使用转换为对象/映射方法(在原始答案下),因为它有一个严重的警告 - 具有相同键的重复条目将被覆盖。

例如:

const input = [[3, 300], [3, 200], [3, 100]];

const obj = Object.fromEntries(input);
const result = { keys: Object.keys(obj), values: Object.values(obj) };

console.log(result);
Run Code Online (Sandbox Code Playgroud)

原答案

在pilchard 的回答之上,我会将数组转换为 Map,然后获取 Map 的键和值。我会使用 Map,而不是对象,因为对象的键始终是字符串,如果值是整数,则对象也会按它们的值排序。Map 将保留原始类型,并且不会重新排序。

const input = [[3, 300], [4, 200], [1, 100]];

const map = new Map(input);
const result = { keys: [...map.keys()], values: [...map.values()] };

console.log(result);
Run Code Online (Sandbox Code Playgroud)

将相同结构转换为对象的示例:

const input = [[3, 300], [4, 200], [1, 100]];

const obj = Object.fromEntries(input);
const result = { keys: Object.keys(obj), values: Object.values(obj) };

console.log(result);
Run Code Online (Sandbox Code Playgroud)