首页 > 解决方案 > 如何将一维数组拆分为基于多个键的数组 - 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];

有没有更好的方法呢?

标签: javascriptarraysmultidimensional-arraylodash

解决方案


作为第一步,将对象转换为拆分对象的一种方法是指定属性名称(这是假设没有更多未知属性):

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>


推荐阅读