Как сгруппировать год по объекту с помощью Javascript? - PullRequest
3 голосов
/ 16 мая 2019

Я хочу создать новый объект в JavaScript для группового года.Он сохранит данные в группу года.

Данные, которые у меня есть сейчас:

{
    "8": {
        "date": "2016-02-26",
        "value": "0.89000"
    },
    "7": {
        "date": "2017-02-27",
        "value": "0.94000"
    },
    "6": {
        "date": "2017-06-01",
        "value": "0.94000"
    },
    "5": {
        "date": "2017-08-30",
        "value": "0.94000"
    },
    "4": {
        "date": "2017-11-30",
        "value": "1.01000"
    },
    "3": {
        "date": "2018-02-28",
        "value": "1.01000"
    },
    "2": {
        "date": "2018-06-01",
        "value": "1.01000"
    },
    "1": {
        "date": "2018-08-31",
        "value": "1.01000"
    },
    "0": {
        "date": "2018-11-30",
        "value": "1.16000"
    }
}

Я хотел бы преобразовать во что-то вроде:

{
    2016: [
            {
                "date": "2016-02-26",
                "value": "0.89000"
            }
    ],
    2017: [
            {
                "date": "2017-02-27",
                "value": "0.94000"
            },
            {
                "date": "2017-06-01",
                "value": "0.94000"
            },
            {
                "date": "2017-06-01",
                "value": "0.94000"
            }, 
            {
                "date": "2017-08-30",
                "value": "0.94000"
            }
    ],
    2018: [
            {
                "date": "2018-02-27",
                "value": "0.104000"
            },
            {
                "date": "2018-06-01",
                "value": "1.01000"
            },
            {
                "date": "2018-08-31",
                "value": "1.01000"
            }, 
            {
                "date": "2018-11-30",
                "value": "1.16000"
            }
    ]
}

Еще немного контента для того, чтобы опубликовать вопрос здесь.Еще немного контента для того, чтобы опубликовать вопрос здесь.Еще немного контента для того, чтобы опубликовать вопрос здесь.Еще немного контента для того, чтобы опубликовать вопрос здесь.Еще немного контента для того, чтобы опубликовать вопрос здесь.

Ответы [ 4 ]

2 голосов
/ 16 мая 2019

Вы можете использовать Array.prototype.reduce ()

Код:

const data = {"8": {"date": "2016-02-26","value": "0.89000"},"7": {"date": "2017-02-27","value": "0.94000"},"6": {"date": "2017-06-01","value": "0.94000"},"5": {"date": "2017-08-30","value": "0.94000"},"4": {"date": "2017-11-30","value": "1.01000"},"3": {"date": "2018-02-28","value": "1.01000"},"2": {"date": "2018-06-01","value": "1.01000"},"1": {"date": "2018-08-31","value": "1.01000"},"0": {"date": "2018-11-30","value": "1.16000"}};
const result = Object.values(data).reduce((a, {date, value}) => {
  const year = date.slice(0, 4);
  a[year] = a[year] || [];
  a[year].push({date, value});
  return a;
}, {});

console.log(result);
2 голосов
/ 16 мая 2019

Вы можете использовать Object.values для преобразования объекта в массив. Используйте reduce для циклического перебора массива и суммирования его в объект. Используйте substring(0, 4), чтобы получить первые 4 символа строки даты.

var obj = {"0":{"date":"2018-11-30","value":"1.16000"},"1":{"date":"2018-08-31","value":"1.01000"},"2":{"date":"2018-06-01","value":"1.01000"},"3":{"date":"2018-02-28","value":"1.01000"},"4":{"date":"2017-11-30","value":"1.01000"},"5":{"date":"2017-08-30","value":"0.94000"},"6":{"date":"2017-06-01","value":"0.94000"},"7":{"date":"2017-02-27","value":"0.94000"},"8":{"date":"2016-02-26","value":"0.89000"}}

var result = Object.values(obj).reduce((c, v) => {
  var y = v.date.substring(0, 4);
  (c[y] = c[y] || []).push(v);
  return c;
}, {});

console.log(result);
1 голос
/ 16 мая 2019

Вы можете сделать это с одним Array.reduce , и вы можете Array.sort до reduce, чтобы получить желаемый отсортированный вывод:

var data = { "8": { "date": "2016-02-26", "value": "0.89000" }, "7": { "date": "2017-02-27", "value": "0.94000" }, "6": { "date": "2017-06-01", "value": "0.94000" }, "5": { "date": "2017-08-30", "value": "0.94000" }, "4": { "date": "2017-11-30", "value": "1.01000" }, "3": { "date": "2018-02-28", "value": "1.01000" }, "2": { "date": "2018-06-01", "value": "1.01000" }, "1": { "date": "2018-08-31", "value": "1.01000" }, "0": { "date": "2018-11-30", "value": "1.16000" } }

let sortedInput = Object.values(data).sort((a,b) => new Date(a.date) - new Date(b.date))

let result = sortedInput.reduce((r, {date, value}, i, a) => {
  let key = date.split('-')[0]
  r[key] = r[key] || []
  r[key].push({date, value})
  return r
}, {})

console.log(result)
1 голос
/ 16 мая 2019

Используйте reduce с Object.values:

const data = {"0":{"date":"2018-11-30","value":"1.16000"},"1":{"date":"2018-08-31","value":"1.01000"},"2":{"date":"2018-06-01","value":"1.01000"},"3":{"date":"2018-02-28","value":"1.01000"},"4":{"date":"2017-11-30","value":"1.01000"},"5":{"date":"2017-08-30","value":"0.94000"},"6":{"date":"2017-06-01","value":"0.94000"},"7":{"date":"2017-02-27","value":"0.94000"},"8":{"date":"2016-02-26","value":"0.89000"}};

const res = Object.values(data).reduce((acc, { date, value }) => {
  let [year] = date.split("-");
  (acc[year] = acc[year] || []).push({ date, value });
  return acc;
}, {});

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

Синтаксис ES5:

var data = {"0":{"date":"2018-11-30","value":"1.16000"},"1":{"date":"2018-08-31","value":"1.01000"},"2":{"date":"2018-06-01","value":"1.01000"},"3":{"date":"2018-02-28","value":"1.01000"},"4":{"date":"2017-11-30","value":"1.01000"},"5":{"date":"2017-08-30","value":"0.94000"},"6":{"date":"2017-06-01","value":"0.94000"},"7":{"date":"2017-02-27","value":"0.94000"},"8":{"date":"2016-02-26","value":"0.89000"}};

var res = Object.keys(data).map(function(key) {
  return data[key];
}).reduce(function(acc, curr) {
  var year = curr.date.split("-")[0];
  (acc[year] = acc[year] || []).push(year);
  return acc;
}, {});

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...