Как вставить данные в массив по определенному индексу, если условие истинно, и ноль, если false

#javascript #arrays

#javascript #массивы

Вопрос:

У меня здесь МЕСЯЦЫ с января по декабрь, и у меня есть пустой массив и МАССИВ ОБЪЕКТОВ

 let person = [
            {
                event: "Birthday",
                date: "May",
                count: 2
            },
            {
                event: "Birthday",
                date: "Jun",
                count: 3
            },
            {
                event: "Birthday",
                date: "Aug",
                count: 14
            },
            {
                event: "Birthday",
                date: "Oct",
                count: 20
            }
        ];

let birthday = []
  

Я использую цикл for для распределения «count» в пустой массив

 for(let j = 0; j < person.length; j  ){
            let event = person[j].event;
            let date = person[j].date;
            let count = person[j].count;

            for(let i = 0; i < MONTHS.length; i  ){
                if(date == MONTHS[i]){
                    bday.push(count);
                    MONTHS.splice(0, i);
                    break;
                }
                else{
                    bday.push(0);
                }
            }
        }
  

Но вместо этого я получаю неверный вывод:

[0, 0, 0, 0, 2, 3, 0, 14, 0, 20, 0, 0] Размер массива должен быть 12

Я получил это (который превышает индекс, и значения, которые я вставляю, имеют неправильный индекс):

[0, 0, 0, 0, 2, 0, 3, 0, 0, 14, 0, 0, 20]

Я использую данные PERSON только для тестирования кода, но на самом деле я использую данные из MYSQL

Комментарии:

1. Чего это splice пытается достичь? не то, что вы думаете

2. 12 результатов указывают как количество Дней рождения в каждом месяце. Единственные месяцы, в которых отмечается День рождения, — это только май, июнь, август, октябрь. Остальные должны быть равны нулю.

3. Проверяйте массив MONTHS после каждой итерации, после первой итерации может все еще быть там, хотя этого не должно быть. Второй аргумент для splice не является конечным индексом вашего подмассива, но указывает, сколько элементов вы хотите удалить из этого массива ( w3schools.com/jsref/jsref_splice.asp ) и поскольку ваш индекс начинается с 0, вы должны добавить к нему единицу при передаче его в splice.

Ответ №1:

Вы могли бы взять объект для получения значений месяца в качестве индекса и обновить birthday массив.

 let person = [{ event: "Birthday", date: "May", count: 2 }, { event: "Birthday", date: "Jun", count: 3 }, { event: "Birthday", date: "Aug", count: 14 }, { event: "Birthday", date: "Oct", count: 20 }],
    months = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 },
    birthday = Array.from(Object.keys(months).fill(0));

person.forEach(({ date, count }) => birthday[months[date]]  = count);

console.log(...birthday);