无需迭代即可将成对数组转换为2个独立数组



我有一个成对的数组,看起来像这个[[x,y], [x,y] ... ]。我想把它格式化成一个Object,其中的值是x和y值的数组,就像{keys: [x1, x2, x3 ...], values: [y1, y2, y3 ... ]}一样。

是否有任何数组/对象操作可以在不遍历原始列表的情况下完成此操作?

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

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);

我实际上不会使用convert to object/Map方法(在Original Answer下),因为它有一个严重的警告——具有相同键的重复条目将被覆盖。

例如:

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);

原始答案

基于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);

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

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);

该过程是迭代的,但您可以使用现有的Object方法来隐藏它:Object.fromEntries()Object.keys()Object.values()

const input = [['a', 1], ['b', 2], ['c', 3]];
const obj = Object.fromEntries(input);
const result = { keys: Object.keys(obj), values: Object.values(obj) };
console.log(result);

Ori Drori使用Map进行的细化不仅对数值更稳健,对任何类型都更稳健。

const input = [[new Date(), { y: 1 }], [new Date(), { y: 2 }], [new Date(), { y: 3 }]];
const map = new Map(input);
const result = { keys: [...map.keys()], values: [...map.values()] };
console.log(result);
console.log(result.keys[0].valueOf());

没有给失败者留下空间,但这只是的另一种方式

const input = [[3, 300], [4, 200], [1, 100]];
const result = { keys: Array.from(input, x => x[0]), values: Array.from(input, x => x[1]) };
console.log(result);

最新更新