![](/img/trans.png)
[英]How to convert array of objects to array of arrays in javascript
[英]javascript, convert an array of objects to an array of arrays vertically
我有一个 CSV 文件,我已使用d3.csv
成功读取该文件。 结果是一个 JSON 文件,其中每一行由一个数组元素组成,每个数组元素是一个 object,键/值对与列标题匹配。
我需要这种“垂直”格式,作为 arrays 的数组,其中每个内部数组由每个 object 的值组成。
这是一个在 Node 中运行的示例:
> a = new Array();
[]
> a.push({"b":2, "c": 4, "d":6, "e": 8});
1
> a.push({"b":3, "c": 6, "d":9, "e": 12});
2
> a.push({"b":4, "c": 8, "d":12, "e": 16});
3
> a.push({"b":5, "c": 10, "d":15, "e": 20});
4
> a
[
{ b: 2, c: 4, d: 6, e: 8 },
{ b: 3, c: 6, d: 9, e: 12 },
{ b: 4, c: 8, d: 12, e: 16 },
{ b: 5, c: 10, d: 15, e: 20 }
]
> x = [[2,3,4,5],[4,6,8,10],[6,9,12,15],[8,12,16,20]]
[ [ 2, 3, 4, 5 ], [ 4, 6, 8, 10 ], [ 6, 9, 12, 15 ], [ 8, 12, 16, 20 ] ]
> x
[
[ 2, 3, 4, 5 ],
[ 4, 6, 8, 10 ],
[ 6, 9, 12, 15 ],
[ 8, 12, 16, 20 ]
]
>
这里, [a]
代表我想要的 object 数组,而[x]
代表我想要的 arrays 数组。
我的数据文件很宽,有很多列。 我尝试了几种玩具解决方案,我可以遍历数组 select 每个元素,然后遍历每个元素和 select 每个键,获取值并将其推送到新数组。 然而,这是令人讨厌的并且很容易被打破。 肯定有更好的方法。
如果我有一个列表列表,我可以翻转行和列。 不幸的是,我有一个 object 的列表,用D3.csv()
读入。
我的主要语言是(注意,是)Perl,Perl-ish 解决方案对我来说很自然。 我当前的应用程序在浏览器中运行客户端,我需要 JavaScript 中的客户端解决方案。
您可以通过多种方式实现这一点,但由于看起来源数组中的所有对象都具有相同的属性,因此最直接的可能是嵌套的map()
调用。 外部map()
在数组第一个元素的Object.keys()
上调用,内部map()
使用源数组中每个 object 上的每个迭代键。
const a = [{ b: 2, c: 4, d: 6, e: 8 }, { b: 3, c: 6, d: 9, e: 12 }, { b: 4, c: 8, d: 12, e: 16 }, { b: 5, c: 10, d: 15, e: 20 }]; const result = Object.keys(a[0]).map(key => a.map(o => o[key])); console.log(result);
如果对象具有不同的属性,您可以使用reduce()
调用来累积相似属性的所有值。
const a = [{ b: 2, c: 4, d: 6, e: 8 }, { b: 3, c: 6, d: 9, e: 12 }, { b: 4, c: 8, d: 12, e: 16 }, { b: 5, c: 10, d: 15, e: 20 }]; const result = Object.values( a.reduce((acc, obj) => { Object.keys(obj).forEach(key => (acc[key]??= []).push(obj[key])); return acc; }, {})); console.log(result);
我喜欢@pilchard 的d3
不可知论答案; 但如果您对d3
驱动的答案感兴趣,您可以在 arrays 数组上使用d3.transpose
,并通过预处理步骤使用Object.values
删除对象的键:
const a = [ { b: 2, c: 4, d: 6, e: 8 }, { b: 3, c: 6, d: 9, e: 12 }, { b: 4, c: 8, d: 12, e: 16 }, { b: 5, c: 10, d: 15, e: 20 } ] const x = d3.transpose(a.map(o => Object.values(o))); console.log(x);
.as-console-wrapper { max-height: 100%;important: top; 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.5.0/d3.min.js"></script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.