将一对数组转换为两个分离的数组,无需迭代

3
我有一个成对的数组,格式如下: [[x,y], [x,y] ... ]。我想将其格式化为一个对象,其中值是包含 x 和 y 值的数组,格式如下:{keys: [x1, x2, x3 ...], values: [y1, y2, y3 ... ]}
是否有任何数组/对象操作可以完成此操作而无需遍历原始列表?

取决于您的意思。您可以使用 .map 将它们分开,但在其核心,它是迭代的。 - Joel Hager
任何解决这个问题的方法都在其核心使用迭代。 - ABDULLOKH MUKHAMMADJONOV
4个回答

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

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

例如:

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


好的,我在这种情况下处理整数。 - anesongib
没错 - 当我看到 [x,y] 时,就是这么想的。 - Ori Drori

3
这个过程是迭代的,但你可以使用现有的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());


1
只有一个注意事项:由于键不能是数字,因此即使它是数字,第一个元素也将被转换为字符串。否则,这是我想提出的非常优雅的解决方案,但你是第一个分享的人。 - Reflective

1

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

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


0
这段代码从一个包含“pairs”数组中提取“x”和“y”值,并将它们组织成一个“object”,其中包含了“x”值(键)和“y”值(值)的分开的数组。

const pairs = [["x1", "y1"], ["x2", "y2"], ["x3", "y3"]]

const keys = pairs.map(([x, _]) => x); 
const values = pairs.map(([_, y]) => y);

const result = { keys, values };

console.log(result);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接