首页 > 解决方案 > 如何解析对象数组,每个对象都有一个日期数组,返回一个唯一的日期数组和两个数据数组

问题描述

我正在努力想出一种格式化这些数据的方法。

期望返回:具有 3 个数组的对象

  1. 一组独特的日期
  2. dates一个 data1 值的数组,其长度与数组的长度相同,null并且索引与dates数组中data1没有值的索引相对应
  3. 与 2 相同,但 data1 值除外

下面显示的示例应该更好地了解我要解决的问题。

期望的结果:

{ dates: ['Tue Jun 20 2018', 
          'Wed Jun 21 2018', 
          'Thu Jun 22 2018',
          'Fri Jun 23 2018',
          'Sat Jun 24 2018'],
  data1: [5, null, 12, null, 20]
  data2: [14, 4, 15, 2, null]
 }

示例输入:具有多个对象的数组。每个对象都有一个dates属性

[
  { dates: ['Tue Jun 20 2018',
            'Thu Jun 22 2018',
            'Sat Jun 24 2018'],
    data1: [5, 12, 20]
  },
  { dates: ['Tue Jun 20 2018', 
            'Wed Jun 21 2018', 
            'Thu Jun 22 2018',
            'Fri Jun 23 2018'],
    data2: [14, 4, 15, 2]
  }
 ]

我可以通过为每个输入对象创建两个对象键值对、将所有日期连接到一个数组中并使其唯一、映射新的日期数组并null在每个数据数组中插入值(如果该特定对象没有该日期作为键)来解决.

抱歉,解释冗长/令人困惑。看看输入/输出,让我知道如何最好地解决这个问题。

谢谢!

标签: javascript

解决方案


null通过添加到所有其他行来转移新日期:

 function merge(data, key, { dates = [], values = {} } = {}) {
   // Add the key to the resulting values
   if(!values[key]) values[key] = [];
   // Go over all dates of the data
   for(const [index, date] of data.dates.entries()) {
     // Add new dates by adding `null` to all keys
     if(!dates.includes(date)) {
       dates.push(date);     
       Object.values(values).forEach(arr => arr.push(null));
     }   
     // then copy the value from data to values
     const pos = dates.indexOf(date);
     values[key][pos] = data[key][index];
   }
   // also add a method for chaining
   return { dates, values, result: { dates, ...values }, merge(data, key){ return merge(data, key, this); }, };
}

可用作:

 const { result } = 
    merge(arr[0], "data1")
   .merge(arr[1], "data2");

推荐阅读