Как вы создаете объект массивов в Javascript

1

Я потратил больше времени на это, чем я хотел бы признать. У меня проблема с созданием объекта, заполненного массивом.

Я хотел бы, чтобы мои данные выглядели так:

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'}],

Так что каждая дата может иметь много пользователей. Надеюсь, это имеет смысл.

Спасибо за любую помощь.

Теги:
object
arrays

3 ответа

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

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);
  • 1
    Это сработало чудесно. Огромное спасибо.
  • 0
    Приятно! Пожалуйста! @ o6t9o
2

Выражение функции, которое вы передаете forEach, имеет это как первую строку:

newItems = {[val.date]:[]};

Это сбрасывает объект newItems на объект с одной парой date: name. Вы действительно хотите что-то большее:

newItems[val.date]?newItems[val.date].push({name:val.full_name}):newItems[val.date]=[];
  • 0
    Это было очень полезно. Спасибо.
1

Вы можете использовать деструктурирование объекта, вычисленное свойство и 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);
  • 0
    Я полностью забыл об Object.assign, это было полезно, но ответ Роко сработал для меня немного лучше.

Ещё вопросы

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