push JS в ассоциативный массив

D
На сайте с 28.06.2008
Offline
1104
1130

Нужно сделать массив, где вторым уровнем будут идти подмассивы с датами

по типу

array [

'2022-04-15' => [...],
'2022-04-16' => [...],

]

Хотел сделать это так  (делаю в цикле)

dayArray[dataFormat].push({'data':el,'name':value['staff_name'],'territory_id':value['territory_id']});

Но получил ошибку.

Так тоже не прокатило

dayArray[dataFormat] += [{'data':el,'name':value['staff_name'],'territory_id':value['territory_id']}];

Как это можно сделать?

D
На сайте с 28.06.2008
Offline
1104
#1

Наверное это можно сделать - через коллекции.

let dayArray = new Map();

и далее в цикле

dayArray.set(dataFormat, [{'data':el,'name':value['staff_name'],'territory_id':value['territory_id']}]);
но так каждый подмассив в дате перезаписывается, а мне бы нужно добавлять новый....
ArbNet
На сайте с 27.10.2019
Online
131
#2
Для программирования нужно уметь думать и решать подобные задачи. Вам надо научиться думать и тогда не будете такие вопросы задавать. Или вы думаете если раньше вам помогали, то всегда будут помогать? Как вы видите людям это уже надоело.
D
На сайте с 28.06.2008
Offline
1104
#3

Я хочу пересобрать массив но не понимаю как это сделать в JS

Я хочу создать новый многомерный массив где

1. Дата

2. ФИО

3. territory_id  (в нем уже данные available_slots)

Вот как я пытаюсь это сделать

 if (Object.keys(json[0]['shedule']).length !== 0){
    let dayArray = [];
      $.each(json[0]['shedule'], function (key, value) {
        let countSlots = value['available_slots'].length;
          for (let i = 0; i < countSlots; i++) {
              let data = new Date(value['available_slots'][i]);
              let dataFormat = data.getFullYear() +''+ ("0" + (data.getMonth() + 1)).slice(-2) +''+ data.getDate();
               dayArray[dataFormat] = [value['staff_name']];
          }
});

В итоге получил 

Я не понимаю почему в цикле можно сделать так

dayArray[dataFormat]

а так уже нельзя

dayArray[dataFormat][value['staff_name']]

?

ДП
На сайте с 23.11.2009
Offline
203
#4

Две мысли.

1. Формально в JS массивы могут быть только с числовыми ключами. Если ключ - строка, то это объект.В php можно в массиве оба варианта ключей использовать.

Видите, у вас в консоли параметр length равен 20220431 - т.е. у вас там дофига пустых значений в массиве, что, насколько я помню, не очень хорошо для производительности.

2. Конкретно по вашему коду, вам "повезло", что дата преобразуется в число и можно это число использовать как индекс у массива. Когда вы пытаетесь записать сразу "внутрь" массива, вы по сути пытаетесь записать сразу внутрь несуществующего объекта. Т.е. сначала надо бы сделать

dayArray[dataFormat] = {}

а потом уже

dayArray[dataFormat][value['staff_name']]


В целом, мой непрошенный совет - работайте и с объектами, там можно ключи делать строковые. Т.е. у вас будет

let dayArray = {};

затем можно будет писать так

dayArray[dataFormat] = {};
dayArray[dataFormat][value['staff_name']] = []
и потом уже делать так
dayArray[dataFormat][value['staff_name']].push({'data':el,'name':value['staff_name'],'territory_id':value['territory_id']}
Т.е. у вас будет объект, у которого будут ключами даты (причем можно в удобном вам формате), значения будут тоже объектами, а вот в этих объектах значения будут уже массивами. Если я правильно понял структуру, которая вам нужна.
ArbNet #:
Для программирования нужно уметь думать и решать подобные задачи. Вам надо научиться думать и тогда не будете такие вопросы задавать. Или вы думаете если раньше вам помогали, то всегда будут помогать? Как вы видите людям это уже надоело.
При вежливо и корректно сформулированных вопросах помочь - вообще не проблема.
D
На сайте с 28.06.2008
Offline
1104
#5
Дикий пионер спасибо за подробное объяснение, следуя Вашим советам все получилось!
W1
На сайте с 22.01.2021
Offline
306
#6
Dram :
Нужно сделать массив, где вторым уровнем будут идти подмассивы

JS не любит массивов, а ассоциативный и многомерный массивы - это вообще не для JS. JS работает с объектами. Выше об этом упомянули, но я просто хочу акцентировать на этом внимание.

Dram #:
Наверное это можно сделать - через коллекции.

Коллекции и массивы - это совершенно разные сущности.

Мой форум - https://webinfo.guru –Там я всегда на связи

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий