javascript - 如何将一维数组拆分为基于多个键的数组 - Javascript?
问题描述
我有一个像这样的一维数组,该数组中的单个对象看起来像这样
[
{
date: "01/01/2020",
type1: 264,
type2: 1937,
type3: 30
},
...
]
我想修改上面的数组并将其转换为以下格式的二维数组
[
[
{
"date": "01/01/2020",
"type": "type1",
"value": 264
},
{
"date": "01/01/2020",
"type": "type2",
"value": 1937
}
.....
],
[
{
"date": "01/01/2020",
"type": "type3",
"value": 30
}
.....
]
]
基本上第一个数组将由 type1 和 type2 值组成,第二个数组将由 type3 值组成。
我对javascript很陌生。我已经尝试过使用普通的javascript,如下所示
const type1 = data.map((e: any) => ({
date: e.date,
type: "type1",
value: e.type1
}));
const type2 = data.map((e: any) => ({
date: e.date,
type: "type2",
value: e.type2
}));
const type3 = data.map((e: any) => ({
date: e.date,
type: "type3",
value: e.type3
}));
const newData = [type1.concat(type2), type3];
有没有更好的方法呢?
解决方案
作为第一步,将对象转换为拆分对象的一种方法是指定属性名称(这是假设没有更多未知属性):
const arr = [{date:'01/01/2020', type1:264,type2: 1937,type3:30}];
const res = _.flatMap(arr,o=> ['type1','type2','type3'].map(t=> ({date:o.date, type:t, value:o[t]})));
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
在那之后,我不确定目标,如果你想要一个单独的数组中的所有类型 3 的对象,无论源对象如何,一个快速而肮脏的方法可能是:
const arr = [{date:'01/01/2020', type1:264,type2: 1937,type3:30}];
const res = [[],[]];
_.flatMap(arr,o=> ['type1','type2','type3'].map(t=> ({date:o.date, type:t, value:o[t]})))
.forEach(o=> res[o.type==='type3' ? 1: 0].push(o));
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
推荐阅读
- css - 如何移动黑框下方的红色边框?
- javascript - MDN 的 Element.hasAttribute() 代码示例令人难以理解,我想清楚其代码片段
- vb.net - 在修复 vb.net 中的某些维度时循环锯齿状数组
- javascript - 改变
- python - 在 Numpy 数组子类中改变 `__getitem__` 和 `__setitem__` 的行为
- c++ - 如何知道命令行中是否提供了 gflag
- c# - 在 VIEW 中使用时多个模型中的错误
- java - 如何使用正则表达式更改 Atom 中的 Java 数组?
- mysql - 按姓氏排序列表,然后首先
- reactjs - 如何在反应中重新加载当前组件?