【问题标题】:How to return a specific range of indexes from within in a JSON Array?如何从 JSON 数组中返回特定范围的索引?
【发布时间】:2021-08-15 00:27:54
【问题描述】:

我有这个从 API 检索到的对象数组。它每天都在不断更新。该数组由每天的时间序列案例组成。我想使用这个数组返回上周每个日期的案例。我已经获取了国家名称并过滤了数组,所以它只显示了用户所在国家的数组。我在想我可以映射数组的日期以找到最后 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
      ),

【问题讨论】:

  • 没有 JSON 数组这样的东西。 response.data 是一个对象数组。
  • 为什么用typescriptreact-native标记?
  • 抓取“日期”(Object.keys()),对它们进行排序,得到第一个/最后一个(取决于排序顺序)七个
  • @Andreas 是的,我的意思是说一个对象数组,但它是一个 JSON。因为我正在使用react-nativetypescript 构建它,所以它被标记了?否则,我为什么要标记这些?你能举一个你的答案的例子吗?
  • Axios 自动将 JSON 解析为数组和对象。如果它真的还是 JSON,它会是一个字符串,当你写 response.data.filter 时你会得到一个错误,因为字符串没有 filter 方法。

标签: arrays json array.prototype.map


【解决方案1】:

如果你可以使用 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);

这个用途

转换为数据集

如您的问题所述,要转换为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));

【讨论】:

  • 谢谢你。有没有办法返回这个数组对象,所以我可以在其他文件中使用它,也许使用道具和钩子?
  • 对象是键值对的未排序集合。因此,只有在解析响应后属性的顺序以正确的顺序结束时,此答案才有效 - 不能保证。
  • @Andreas 你是对的,谢谢你的收获!我只是想展示reduce 的替代品(如@denis-t 的回答),但忘记了订单?‍♂️ 我会编辑以反映这一点。
  • @Andreas @ rsmeral 感谢两位对此的见解。你对我上面的问题有答案了吗?
  • “其他文件”是什么意思?喜欢子组件? “这个数组对象”是什么意思?包含特定国家/地区过去 7 天的对象?
【解决方案2】:

使用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] }), {})
}

【讨论】:

  • 而不是.sort().reverse(),只是列表末尾的.slice().slice(-7)
猜你喜欢
  • 2018-05-02
  • 2018-05-29
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多