Я бы написал это, используя Array.reduce
для создания конечного объекта.
var dates = {
'2018/07/25': [
['r', 'red'],
['b', 'blue']
],
'2018/07/26': [
['a', 'apple'],
['o', 'orange']
],
'2018/08/01': [
['d', 'deer'],
['l', 'lion']
]
}
var result = Object.keys(dates).reduce((mem, cur) => {
var key = cur.slice(0, 7);
mem[key] = { ...(mem[key] || {}),
[cur]: dates[cur]
};
return mem;
}, {});
console.log(result);
Ваш код не дает правильного результата, потому что вы забыли объединить свойства при добавлении новых свойств.Смотрите, когда вы делаете { [onedate] : [...dates[onedate]] }
, здесь вам нужно объединить старые записи также, как я делал ниже.
newObject[monthdate] = {...newObject[monthdate], [onedate] : [...dates[onedate]]};
Ваш код после исправления:
var dates = {
'2018/07/25': [
['r', 'red'],
['b', 'blue']
],
'2018/07/26': [
['a', 'apple'],
['o', 'orange']
],
'2018/08/01': [
['d', 'deer'],
['l', 'lion']
]
}
var newObject = {};
Object.keys(dates).forEach((onedate, index) => {
var monthdate = onedate.slice(0, 7)
newObject[monthdate] = { ...newObject[monthdate],
[onedate]: [...dates[onedate]]
};
});
console.log(newObject)