如何从 JSON 数组中 return 特定范围的索引?

How to return a specific range of indexes from within in a JSON Array?

我有从 API 中检索到的对象数组。它每天都在不断更新。该数组由每天的案例时间序列组成。我想使用此数组 return 上周每个日期的个案。我已经获取了国家名称并过滤了数组,所以它只显示用户国家的数组。我在想我可以映射数组的日期以找到最后 7 个索引。有办法吗?

useEffect(() => {
      axios
        .get("https://api.covid19india.org/v4/min/timeseries.min.json")
        .then((response) => {
          setEarliest2(response.data);

          const stateArray = response.data.filter(
            (item) => item.country === mappedLocation.stateShort
          );
}
{
  "AN": {
    "dates": {
      "2020-03-26": {
        "delta": {
          "confirmed": 1
        },
        "delta7": {
          "confirmed": 1
        },
        "total": {
          "confirmed": 1
        }
      },
      "2020-03-27": {
        "delta": {
          "confirmed": 5
        },
        "delta7": {
          "confirmed": 6
        },
        "total": {
          "confirmed": 6
        }
      },
      "2020-03-28": {
        "delta": {
          "confirmed": 3
        },
        "delta7": {
          "confirmed": 9
        },
        "total": {
          "confirmed": 9
        }
      },
      "2020-03-29": {
        "delta7": {
          "confirmed": 9
        },
        "total": {
          "confirmed": 9
        }
      },
      "2020-03-30": {
        "delta": {
          "confirmed": 1
        },
        "delta7": {
          "confirmed": 10
        },
        "total": {
          "confirmed": 10
        }
      },
  ...
}
const DataSet = (props) => {
return [
    {
      x: new Date(
        parseInt(moment().format("YYYY")),
        parseInt(moment().format("M")),
        parseInt(moment().format("DD")) - 7
      ),

使用 Object.keys 获取日期数组,然后对其进行排序、切片并从原始响应中获取个案:

function getLast7DaysCases (response) {
  const cases = response.data['AN'].dates
  return Object.keys(cases)
    .sort()
    .reverse()
    .slice(0, 7)
    .reduce((acc, k) => ({ ...acc, [k]: cases[k] }), {})
}

如果可以使用ES2019+:

const getPastCasesByCountry = (response, country, pastDays) => Object.fromEntries(
  Object.entries(response[country].dates)
    .sort(([date1], [date2]) => date1.localeCompare(date2))
    .slice(-pastDays)
);

const last7DaysAN = getPastCasesByCountry(response, 'AN', 7);

这使用

  • 方便的 Object.entries + Object.fromEntries 组合让您能够像处理数组一样处理对象
  • 事实上 Array.slice 可以采用负开始索引,这是与结束的偏移量——正如我们在这里需要的那样

转换为数据集

要按照您的问题中的描述转换为 DataSet,我会稍微更改一下函数:

const getPastCasesByCountry = (response, country, pastDays) => 
  Object.entries(response[country].dates)
    .sort(([date1], [date2]) => date1.localeCompare(date2))
    .slice(-pastDays)

const DataSet = (casesByDate) => casesByDate.map(([dateString, cases]) => ({
  x: new Date(dateString),
  y: cases.total.confirmed
}))

const data = DataSet(getPastCasesByCountry(response, 'AN', 7));