У меня есть код, который отлично работает, он извлекает данные в поле "counts" json и помещает его в массив. Вот этот код:
const data = {
"report": {
"type": "trended",
"elements": [{
"id": "page",
"name": "Page"
}],
"reportSuite": {
"id": "retail",
"name": "GlobPROD"
},
"period": "Wed. 3 Oct. 2018 - Fri. 5 Oct. 2018",
"metrics": [{
"id": "pageviews"
}],
"segments": [{
"id": "s13bb443734ab6a764639ff37",
"name": "Information"
}],
"data": [{
"name": "Wed. 3 Oct. 2018",
"year": 2018,
"month": 10,
"day": 3,
"hour": 0,
"breakdown": [{
"name": "CATEGORY:>Statement",
"url": "",
"counts": ["242"]
}, {
"name": "CATEGORY:>Log On",
"url": "...CheckId.do",
"counts": ["237"]
}],
"breakdownTotal": ["2123"]
}, {
"name": "Wed. 3 Oct. 2018 (Hour 1)",
"year": 2018,
"month": 10,
"day": 3,
"hour": 1,
"breakdown": [{
"name": "CATEGORY:>Statement",
"url": "",
"counts": ["152"]
}, {
"name": "CATEGORY:>Log On",
"url": "",
"counts": ["135"]
}],
"breakdownTotal": ["1140"]
}]
}
}
const label = data.report.data.reduce((r, e) => {
e.breakdown.forEach(el => {
let key = "data";
if (!r[key]) r[key] = []
r[key].push(...el.counts)
})
//return r['data'];
return r;
}, {})
console.log(label);
Тем не менее, я хотел дублировать этот код, а также вытащить поле "день" (в приведенном выше примере это было 3).
const label = data.report.data.reduce((r, e) => {
e.breakdown.forEach(el => {
let key = "data";
if(!r[key]) r[key] = []
r[key].push(...el.day)
})
//return r['data'];
return r;
}, {})
console.log (label);
В приведенном выше случае я просто изменил "счет" на "день", но это дает ошибку. Я думаю, потому что "день" - это уровень выше "counts" в JSON, поэтому я попытался удалить один из периодов до el.day, но затем он дает мне следующую ошибку.
Uncaught SyntaxError: Unexpected token.
Оцените это довольно просто, но как вернуть значение дня вместо значения counts.
Если ваше ожидаемое значение является массивом, рассмотрите возможность использования map
, особенно если всегда будет значение:
const data = getData()
const days = data.report.data.map(obj => obj.day);
console.log('days:', days);
function getData() {
return {
"report": {
"type": "trended",
"elements": [{
"id": "page",
"name": "Page"
}],
"reportSuite": {
"id": "retail",
"name": "GlobPROD"
},
"period": "Wed. 3 Oct. 2018 - Fri. 5 Oct. 2018",
"metrics": [{
"id": "pageviews"
}],
"segments": [{
"id": "s13bb443734ab6a764639ff37",
"name": "Information"
}],
"data": [{
"name": "Wed. 3 Oct. 2018",
"year": 2018,
"month": 10,
"day": 3,
"hour": 0,
"breakdown": [{
"name": "CATEGORY:>Statement",
"url": "",
"counts": ["242"]
}, {
"name": "CATEGORY:>Log On",
"url": "...CheckId.do",
"counts": ["237"]
}],
"breakdownTotal": ["2123"]
}, {
"name": "Wed. 3 Oct. 2018 (Hour 1)",
"year": 2018,
"month": 10,
"day": 3,
"hour": 1,
"breakdown": [{
"name": "CATEGORY:>Statement",
"url": "",
"counts": ["152"]
}, {
"name": "CATEGORY:>Log On",
"url": "",
"counts": ["135"]
}],
"breakdownTotal": ["1140"]
}]
}
}
}
Чтобы получить этот день, вам не нужно data.report.data
breakdown
поскольку атрибут day
является прямым атрибутом объекта data.report.data
, это должно быть просто:
const label = data.report.data.reduce((r, e) => {
if( e.hasOwnProperty('day') ) r.push(e.day);
return r;
}, {})
ПРИМЕЧАНИЕ. Лучше использовать .hasOwnProperty()
чтобы проверить, имеет ли объект указанное свойство как свое собственное свойство.
Поскольку свойство day
является свойством родительского объекта, а не поддепозита breakdown
, удалите внутренний цикл и передайте массив в качестве начального значения для редуктора:
const data={"report":{"type":"trended","elements":[{"id":"page","name":"Page"}],"reportSuite":{"id":"retail","name":"GlobPROD"},"period":"Wed. 3 Oct. 2018 - Fri. 5 Oct. 2018","metrics":[{"id":"pageviews"}],"segments":[{"id":"s13bb443734ab6a764639ff37","name":"Information"}],"data":[{"name":"Wed. 3 Oct. 2018","year":2018,"month":10,"day":3,"hour":0,"breakdown":[{"name":"CATEGORY:>Statement","url":"","counts":["242"]},{"name":"CATEGORY:>Log On","url":"...CheckId.do","counts":["237"]}],"breakdownTotal":["2123"]},{"name":"Wed. 3 Oct. 2018 (Hour 1)","year":2018,"month":10,"day":3,"hour":1,"breakdown":[{"name":"CATEGORY:>Statement","url":"","counts":["152"]},{"name":"CATEGORY:>Log On","url":"","counts":["135"]}],"breakdownTotal":["1140"]}]}}
const label = data.report.data.reduce((r, e) => {
if (e.day) r.push(e.day);
return r;
}, []);
console.log(label);