Javascript функция, возвращающая «не может прочитать свойство, длина которого не определена» - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь создать функцию, которая принимает массив, содержащий вложенные массивы и число. Массив, который я использую в качестве параметра, представляет время, в которое разные ученики приходили в класс, каждый вложенный массив - это набор времен. Число представляет минимальное количество студентов, которые должны появиться, чтобы начать занятие. Значения внутри каждого вложенного массива - числа, эти числа должны быть либо 0, либо отрицательными. Если количество нулей и отрицательных значений равно количеству студентов, необходимых для начала класса, или больше, тогда функция должна преобразовать sh истинное логическое значение в массив, который функция будет возвращать позже. Если студентов недостаточно, он должен поместить sh ложное логическое значение в тот же массив. Итак, если у нас есть 3 вложенных массива, первый из которых содержит достаточное количество студентов, а два других - нет, возвращаемый результат должен быть [true, false, false]. Вот что я написал до сих пор:

function openings (arrayOfTimes, studentsRequired){
    const openWhen = [];
    for (let i = 0; i <= arrayOfTimes.length; i++){ 
        var x = arrayOfTimes[i]; 
        for (let j = 0; j <= x.length; j++){ 
            let y = x[i]; 
            let z = [];
            if (y <= 0){
                z.push(y);
            }
            let open = true; 
            if (z.length >= studentsRequired){ 
                openWhen.push(open);
            }
            let notOpen = false;
             if (z.length < studentsRequired){
                openWhen.push(notOpen);
            }
        }
    }
    return openWhen;
}

console.log(openings([[1,2,0],[0,0,-1],[-2,-3,0]],2));

В выводе говорится, что "не удается прочитать длину свойства undefined", при просмотре журнала ошибок указывается, что неопределенное свойство - x.

Это мой первый time, используя оба вложенных массива и a для l oop внутри другого для l oop. Я ценю любое понимание и объяснение того, где я ошибся. Большое спасибо.

1 Ответ

4 голосов
/ 14 июля 2020

В ваших циклах for вы используете i <= arrayOfTimes.length и j <= x.length. Если вы измените эти циклы на i < arrayOfTimes.length и j < x.length, они будут работать правильно. Имейте в виду, что первый элемент массива имеет индекс 0, что означает, что длина массива всегда будет на 1 больше, чем максимальный индекс массива.

Я переписал функция должна быть немного проще, и я ее протестировал. Он возвращает логическое значение для каждого подмассива, истина, если подмассив содержит хотя бы минимальное количество значений меньше 1.

function openings (timesArray, minimum) {
   return timesArray.map((times) => {
      return times.filter(time => time < 1).length >= minimum;
   });
}

Ваш пример ввода

console.log(openings([[1,2,0],[0,0,-1],[-2,-3,0]],2));
// returns [ false, true, true ]
...