javascript - 使用 javascript 将两个数据集“压缩”在一起的最佳方法
问题描述
我有两个看起来像这样的数据结构:
const labels = [
"2020-07-30",
"2020-07-31",
"2020-08-01",
"2020-08-02",
"2020-08-03",
"2020-08-04",
"2020-08-05",
"2020-08-06"
]
const data = {
"datasetOne": [
{
"date": "2020-07-30",
"metric": "someMetric",
"value": 5.6,
"dataset": "datasetOne"
},
{
"date": "2020-07-31",
"metric": "someMetric",
"value": 5.9,
"dataset": "datasetOne"
},
{
"date": "2020-08-01",
"metric": "someMetric",
"value": 5.7,
"dataset": "datasetOne"
},
{
"date": "2020-08-02",
"metric": "someMetric",
"value": 7.7,
"dataset": "datasetOne"
}
],
"datasetTwo": [
{
"date": "2020-08-02",
"metric": "someOtherMetric",
"value": 7.7,
"dataset": "datasetTwo"
}
]
};
我需要填写每个数据集中的记录,例如data.datasetOne, data.DatasetTwo
,以便date
标签数组中的每个都有记录。我很难为此想出一个优雅的解决方案。我一直以双嵌套的 forEach 结尾。有.find()
没有人有更简洁的方法?
编辑:
这是迄今为止我能想到的最好的:
for ( let dataset in data ) {
const nullFilled = labels.reduce((acc, currentValue) => {
const record = data[dataset].find(record => record.date === currentValue)
return [...acc, record ? { ...record } : { date: currentValue, metric: null, value: null, dataset: null}]
}, [])
data[dataset] = nullFilled
}
解决方案
我将首先使用标签中的值键创建对象。然后,如果日期在标签内,则添加到数组中。如果您使用的是 es6,则可以使用 set 而不是 object 来转换标签。
let labels = [
"2020-07-30",
"2020-07-31",
"2020-08-01",
"2020-08-02",
"2020-08-03",
"2020-08-04",
"2020-08-05",
"2020-08-06"
]
labels = labels.reduce(
( acc,cur)=> { acc[cur] = cur; return acc; }
,{})
console.log(labels)
const data = {
"datasetOne": [
{
"date": "2020-07-30",
"metric": "someMetric",
"value": 5.6,
"dataset": "datasetOne"
},
{
"date": "2020-07-31",
"metric": "someMetric",
"value": 5.9,
"dataset": "datasetOne"
},
{
"date": "2020-08-01",
"metric": "someMetric",
"value": 5.7,
"dataset": "datasetOne"
},
{
"date": "2020-08-02",
"metric": "someMetric",
"value": 7.7,
"dataset": "datasetOne"
}
],
"datasetTwo": [
{
"date": "2020-08-02",
"metric": "someOtherMetric",
"value": 7.7,
"dataset": "datasetTwo"
}
]
};
let mergedData = [];
Object.entries(data).forEach(entry => {
const [key, value] = entry;
mergedData.push(value.reduce((acc,el)=>{
if(labels[el.date.trim()]!=undefined ){
acc.push(el)
}
return acc
} ,[])
)
});
console.log(mergedData)
推荐阅读
- perl - 按多列对表格数据进行分组
- java - 我如何在 Spring Security oauth2 中进行权限访问控制?
- bash - 带有换行符的 Bash 变量在 csv 文件中未正确表示
- typescript - 使用 process.exit 进行 TypeScript 推理
- laravel - 拉拉维尔 5.8。如何在验证期间修剪 http 并检查表中的唯一性?
- docker - 如何在 CI 构建期间减少 docker pull 时间?
- python - 克服 SSL:使用 urllib3 时 Windows 10 上的 CERTIFICATE_VERIFY_FAILED
- css - 大边框大小的问题(不是完整的矩形)
- r - 返回矩阵每列 N 最小值/最大值的索引行数
- jdbc - 如何使用 H2 数据库设置 CharacterEncoding?