chuikoffru
@chuikoffru
Full Stack JS Developer

Как разделить даты по месяцам в массиве?

Есть массив дат:

['29-09-2016', '30-09-2016', '01-10-2016', '02-10-2016'];


Мне нужно разделить этот массив на два в таком виде:

['09' : ['29-09-2016', '30-09-2016'], '10' : ['01-10-2016', '02-10-2016']]


Пытаюсь сделать таким образом, но получаю ошибку:

export default (arr) => {
    let newarr = [];
    let m = '00';
    arr.map((date, i) => {
        if(m != date.split('-')[1]) {
            m = date.split('-')[1];
            newarr[m].push(date);
        } else {
            newarr[m].push(date);
        }
    });
}


Что я не так делаю?
  • Вопрос задан
  • 1336 просмотров
Решения вопроса 1
chuikoffru
@chuikoffru Автор вопроса
Full Stack JS Developer
Разобрался как лучше делать, чтобы потом обходить массив.

function splitDaysByMonth(arr) {
    let newarr = {
        month : []
    };
    let m = "00";
    arr.map((date, i) => {
        if(m != date.split('-')[1]) {
            m = date.split('-')[1];
            newarr.month.push(m);
            newarr[m] = [];
            newarr[m].push(date);
        } else {
            newarr[m].push(date);
        }
    });
    return newarr;
}


Потом делаю так:

let booking = splitDaysByMonth(days);

booking.month.map((b) => {
  console.log(booking[b]);
});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Что я не так делаю?
Тащите структуры данных из одного языка в другой; не понимаете, чем массив отличается от объекта в javascript и для каких целей каждый из них используется.
Ответ написан
Комментировать
@Maa-Kut
У вас newarr[m] не инициализирован на момент вызова push. Думаю, должно было быть что-то вроде:
export default (arr) => {
    let newarr = {};
    let m = '00';
    arr.map((date, i) => {
        m = date.split('-')[1];
        if (!newarr[m])
        	newarr[m] = [];
        newarr[m].push(date);
    });
    return newarr;
};
Ответ написан
iCoderXXI
@iCoderXXI
React.JS/FrontEnd engineer
Это не массив дат, это массив строк, похожих на дату.

Т.к. структура строк идентична и форматирована, и заранее известно где находится значение месяца в каждом элементе массива, то я бы строковыми функциями (javascript.ru/string/substr) вынимал бы значение месяца, проверял, есть ли в результирующем массиве нужный раздел (по номеру месяца), если нет то создавал его пушем, далее в него пушем складывал бы значение.

Сплит я бы пользовать не стал, т.к. это гораздо более затратная по ресурсам функция и она тут просто не нужна от слова совсем.

ЗЫ: Код за тебя я писать не буду, не грусти. :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы