我正在努力想出一种格式化数据的方法。
所需退货: 具有3个数组的对象
dates
数组的长度相同,带有null
,并且索引与dates
所做的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
值(如果该特定对象)没有该日期作为键。
很抱歉造成冗长/混乱的解释。看一下输入/输出,让我知道如何才能最好地解决这个问题。
谢谢!
答案 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");