Я потратил больше времени на это, чем я хотел бы признать. У меня проблема с созданием объекта, заполненного массивом.
Я хотел бы, чтобы мои данные выглядели так:
items={
{
'2012-05-22': [{text: 'item 1 - any js object'}],
'2012-05-23': [{text: 'item 2 - any js object'}],
'2012-05-24': [],
'2012-05-25': [{text: 'item 3 - any js object'},{text: 'any js object'}],
}
}
Я делаю вызов базы данных, и полученные данные выглядят следующим образом:
Object {start: "08:00:00", end: "09:00:00", full_name: "Tomomi", date: "2017-06-08", Barber_id: "1"…}
Данные, которые меня интересуют, - это значение full_name и значение даты.
Это то, что я пытался:
let newItems = {};
axios.post(endpoint, {lookup: day.dateString}).then((customerData) => {
customerData.data.forEach((val,key)=>{
newItems = {[val.date]:[]};
newItems[val.date].push({name:val.full_name});
console.log(newItems);
})
}
Это выглядит так:
Object {2017-06-08: Array(1)}
2017-06-08
:
Array(1)
Это очень близко, но проблема в том, что мой код перезаписывает мои данные. Я пытаюсь создать это динамически:
'2012-05-25': [{text: 'item 3 - any js object'},{text: 'any js object'}],
Так что каждая дата может иметь много пользователей. Надеюсь, это имеет смысл.
Спасибо за любую помощь.
var byDate = {}; // Object to store received data by-date
function addIntoByDate( obj ) {
byDate[obj.date] = byDate[obj.date] || [];
byDate[obj.date].push( obj );
}
// Simulate adding server data one by one
addIntoByDate( {date: "2017-06-08", full_name: "Cat", text:"Foo!!"} ); // < SAME DATE
addIntoByDate( {date: "2016-05-23", full_name: "Dog", text:"Bar"} );
addIntoByDate( {date: "2017-06-08", full_name: "Bug", text:"Baz..."} ); // < SAME DATE
// test
console.dir(byDate);
Выражение функции, которое вы передаете forEach, имеет это как первую строку:
newItems = {[val.date]:[]};
Это сбрасывает объект newItems на объект с одной парой date: name. Вы действительно хотите что-то большее:
newItems[val.date]?newItems[val.date].push({name:val.full_name}):newItems[val.date]=[];
Вы можете использовать деструктурирование объекта, вычисленное свойство и Object.assign()
const newItems = {};
const data = [
{
start: "08:00:00"
, end: "09:00:00"
, full_name: "Tomomi"
, date: "2017-06-08"
, Barber_id: "1"
}
];
data.forEach(({date, full_name}) =>
Object.assign(newItems, {[date]: [{/* text: */ full_name}]}));
console.log(newItems);