首页 > 解决方案 > 指向 JSON blob 中的不同值以放入数组中

问题描述

我有一些完美运行的代码,它将数据提取到“计数”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);

但是,我想复制这段代码,并拉出“day”字段(在上面的示例中,它是 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”更改为“day”,但这会产生错误。我认为这是因为“day”是 JSON 中“counts”之上的一个级别,所以我尝试删除 el.day 之前的一个句点,但它给了我以下错误。

Uncaught SyntaxError: Unexpected token.

欣赏它非常简单,但我如何返回日值而不是计数值。

标签: javascriptarraysjsonobject

解决方案


breakdown因为day属性是对象的直接属性,所以你不必循环访问的那一天data.report.data,它应该是简单的:

const label = data.report.data.reduce((r, e) => {
    if( e.hasOwnProperty('day') ) r.push(e.day);

    return r;
}, {})

注意:最好使用.hasOwnProperty()检查对象是否具有指定的属性作为自己的属性。


推荐阅读