代码之家  ›  专栏  ›  技术社区  ›  Jimmy

指向JSON blob中的不同值以放入数组

  •  1
  • Jimmy  · 技术社区  · 6 年前

    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.
    

    很简单,但我如何返回日值而不是计数值。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Mike    6 年前

    如果期望值是数组,请考虑使用 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"]
          }]
        }
      }
    }
        2
  •  2
  •   Zakaria Acharki    6 年前

    为了得到一天,你不必在 breakdown day 属性是 data.report.data 对象,应该是:

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

    注: .hasOwnProperty() 检查对象是否将指定的属性作为其自己的属性。

        3
  •  1
  •   CertainPerformance    6 年前

    因为 day 属性是父对象的属性,而不是 breakdown 子属性,移除内部循环,并传入一个数组作为reducer的初始值:

    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);