Отформатируйте длинный массив объекта js, отделяя даты к числу и цветовое отношение к месяцу к датам к числам и соответствующим цветам - PullRequest
0 голосов
/ 25 августа 2018
let dates = {
              '2018/07/25': [['1','red'], ['1','orange'], ['3','blue']],
              '2018/07/26': [['2','black'], ['4','orange'], ['4','pink']],
              '2018/08/01': [['3','purple'], ['4','green']]
            } 

Ожидается новый объект:

newObject = {
             '2018/07':{
                         '2018/07/25': {
                                         '1':['red','orange'],
                                         '3':['blue']
                                       },
                         '2018/07/26': {
                                         '2':['black'],
                                         '4':['orange','pink']
                                       }
                       },
             '2018/08':{
                         '2018/08/01': {
                                         '3':['purple'],
                                         '4':['green']
                                       }
                       }
             }

Мой код пока:

let newObject = {};

Object.keys(dates).forEach((onedate, index) => {
    let monthdate = onedate.slice(0,7)
    if (!newObject[monthdate]) {
        newObject[monthdate] = {};
    }    
    newObject[monthdate][onedate] = [...dates[onedate]];
});

Вывод вышеуказанного кода:

newObject = {
             "2018/07":{
                         "2018/07/25": [["1","red"],["1","orange"],["3","blue"]],
                         "2018/07/26": [["2","black"],["4","orange"],["4","pink"]]
                        },
             "2018/08":{
                         "2018/08/01": [["3","purple"],["4","green"]]
                       }
             }

Iхочу удалить массив на уровне 3 глубины тоже.Также отделите первое число, используя наборы, и соотнесите их с цветами

"2018/07/25": [["1","red"],["1","orange"],["3","blue"]]

до

'2018/07/25': {'1':['red','orange'],'3':['blue']}

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Можно использовать базовые reduce() для массивов, чтобы сопоставить их с желаемой структурой объекта

let dates = {
              '2018/07/25': [['1','red'], ['1','orange'], ['3','blue']],
              '2018/07/26': [['2','black'], ['4','orange'], ['4','pink']],
              '2018/08/01': [['3','purple'], ['4','green']]
            }
            
let newObject = {};

Object.keys(dates).forEach((onedate, index) => {
    let monthdate = onedate.slice(0,7)
    if (!newObject[monthdate]) {
        newObject[monthdate] = {};
    }    
    newObject[monthdate][onedate] = dates[onedate].reduce((a,c)=>{
        a[c[0]] = a[c[0]] || [];
        a[c[0]].push(c[1])
        return a;
    },{})
});

console.log(newObject)
0 голосов
/ 25 августа 2018

Вы действительно близки, чтобы найти решение. Вот как это можно сделать с помощью редуктора:

let dates = {
  '2018/07/25': [['1','red'], ['1','orange'], ['3','blue']],
  '2018/07/26': [['2','black'], ['4','orange'], ['4','pink']],
  '2018/08/01': [['3','purple'], ['4','green']]
};

let newObject = {};

Object.keys(dates).forEach((onedate, index) => {
  const colors = dates[onedate];

  const colorsMap = colors.reduce((accumulator, [monthId, color]) => {
    accumulator[monthId] = accumulator[monthId] === undefined ? [] : accumulator[monthId];
    accumulator[monthId].push(color);
    return accumulator;
  }, Object.create(null));

  let monthdate = onedate.slice(0,7)
  if (!newObject[monthdate]) {
    newObject[monthdate] = {};
  }
  newObject[monthdate][onedate] = colorsMap;
});

console.log(newObject)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...