减少数组中包装数据的函数

Reduce function wrapping data in an array

我有一个 reduce 函数,可以按照我需要的方式格式化我的数据,但唯一的问题是数据嵌套在数组中。我需要删除外部数组或只是停止将其添加到 reduce 函数中,但我为阻止 reducer 将数据包装在数组中所做的每一次尝试都会破坏我的代码。理想情况下,我希望我的 reducer 不将数据包装在一个数组中,但如果那不可能,那么从 reducer 内部干净地删除我需要的数组似乎是唯一的解决方案:

我的数据是这样的:

{
  count: 4,
  datapoints: [
    {
      Date: "2021-05-05",
      score: 0,
    },
    {
      Date: "2021-05-12",
      score: 0,
    },
    {
      Date: "2021-05-30",
      score: 0,
    },
    {
      Date: "2021-06-03",
      score: 114,
    },
  ],
};

我的 reducer 函数和 api 调用:

const riskScores = await api.PCC.riskAssessment(userID, startdate, endDate);

const riskScoresFormatted = riskScores.datapoints.reduce((result, data) => {
        const scores = result["riskAssessment"] || [];
        scores.push({
          value: data.score,
          unit: "none",
          recordedDate: data.Date,
          method: "none",
          type: "riskAssessment",
        });
        result["riskAssessment"] = scores;
        return result;
      }, []);

输出:

[riskAssessment: [{…}, {…}, {…}, {…}] ]

我试过只使用返回未定义的 riskScoresFormatted[0] 的索引。 riskScoresFormatted.slice(1) 只是 returns 一个空数组。我还尝试将第一个项目作为目标,例如 riskScoresFormatted.riskAssessment 这可行,但该值有时为空,因此稍后会导致错误。

尝试将最终的 reduce 参数从 [] 更改为 {},我认为你的运气会更好。

const riskScoresFormatted = riskScores.datapoints.reduce((result, data) => {
  const scores = result["riskAssessment"] || [];
  scores.push({
    value: data.score,
    unit: "none",
    recordedDate: data.Date,
    method: "none",
    type: "riskAssessment",
  });
  result["riskAssessment"] = scores;
  return result;
}, {});

或者,使用 Array.map() 代替:

const riskScores = {
  count: 4,
  datapoints: [{
      Date: "2021-05-05",
      score: 0,
    },
    {
      Date: "2021-05-12",
      score: 0,
    },
    {
      Date: "2021-05-30",
      score: 0,
    },
    {
      Date: "2021-06-03",
      score: 114,
    },
  ],
};

var riskScoresFormatted = riskScores.datapoints.map((data) => ({
  value: data.score,
  unit: "none",
  recordedDate: data.Date,
  method: "none",
  type: "riskAssessment",
}));

console.log(riskScoresFormatted);