如何从 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));
我有从 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));