Укажите другое значение в двоичном объекте JSON для размещения в массиве.

1

У меня есть код, который отлично работает, он извлекает данные в поле "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.

  • 0
    Можете ли вы привести точный пример ожидаемого результата с учетом данных?
  • 0
    @CertainPerformance - да, в этом случае это будет ["3", "3"], потому что обе записи имеют значение дня 3
Показать ещё 1 комментарий
Теги:
object
arrays

3 ответа

1
Лучший ответ

Если ваше ожидаемое значение является массивом, рассмотрите возможность использования 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

Чтобы получить этот день, вам не нужно 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() чтобы проверить, имеет ли объект указанное свойство как свое собственное свойство.

1

Поскольку свойство 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню