如何解析对象数组,每个对象都有一个dates数组,返回一个唯一的dates数组和两个数据数组

时间:2018-10-05 20:59:38

标签: javascript

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

所需退货: 具有3个数组的对象

  1. 唯一的日期数组
  2. 一个data1数组,其值与dates数组的长度相同,带有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]
  }
 ]

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

很抱歉造成冗长/混乱的解释。看一下输入/输出,让我知道如何才能最好地解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

通过在所有其他行上添加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");