首页 > 解决方案 > 使用 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
}

标签: javascript

解决方案


我将首先使用标签中的值键创建对象。然后,如果日期在标签内,则添加到数组中。如果您使用的是 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)


推荐阅读