Halo, прежде всего, прошу прощения, если это простой вопрос, но сейчас я застрял, чтобы понять, какая у меня ошибка. (Я только изучаю JavaScript, кстати). Итак, у меня есть функция, которая будет создавать массив строк, если длина массива нечетная, самая середина массива будет содержать звездочку, а остальное будет просто пустой строкой. Но если длина массива четная, индекс mid и before mid будет содержать звездочку (*). Тестовый пример будет таким:
console.info (Exercise(5) // ['','','*','','']
console.info (Exercise(4) // ['','*','*','']
console.info( Exercise1(0)) // invalid input
Я понял, что сначала вам нужно создать массив, содержащий строку, а затем разделить длину массива на 2, чтобы мы могли знать, является ли массив четным или нечетным. Если нечетное, я помещаю звездочку в индексный массив [mid], а если четное, я помещаю звездочку в индексный массив [mid-1] и [mid]. Вот что у меня получилось:
function Exercise1(num){
var result = [] ;
var midArr = num.length/2
var oddArr = Math.floor (midArr)
for (var i = 0; i<num.length; i++){
if (num.length % 2 !== 0) {
result = push.result(num[oddArr]('*'))
return result
} else if (num.length % 2 === 0 ){
result = push.result(num[midArr-1][mid]('*'));
return result
} else {
return invalid ;
}
}
}
Я не знаю, что делаю не так. Это моя логика, или мой синтаксис неверен, или я просто глуп.
я не понимаю :(
@nomad использует var midArr = num/2 вместо var midArr = num.length/2, поскольку num - это число, а не массив
вы можете посоветовать, что мне нужно исправить в моем коде?
@maljukan ох, понятно, чтобы мы могли узнать, четное или нечетное, верно?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Более простой способ - создать массив пустых строк, равный половине длины массива, а затем использовать распространение:
function Exercise(length) {
if (!Number.isInteger(length) || length < 1) return null;
const blanks = Array(Math.floor((length - 1) / 2)).fill('');
return length % 2 === 0
? [...blanks, '*', '*', ...blanks]
: [...blanks, '*', ...blanks];
}
console.info(Exercise(5));
console.info(Exercise(4));
console.info(Exercise(0));ооо, поэтому вы назначаете пустую строку переменной / const. Я не думал об этом
но я не совсем понял синтаксис: if (! Number.isInteger (length) || length <1) return null; const blanks = Массив (Math.floor ((длина - 1) / 2)). fill (''); длина возврата% 2 === 0 не могли бы вы уточнить?
Первая строка возвращает ноль, если ввод не в желаемом формате. Вторая строка создает массив пустых строк на половину длины или на половину длины минус один (в зависимости от того, что дает целое число. Затем просто распределите его по возвращаемому массиву.
а что с вопросительным знаком перед массивом? это требование распространять массив?
Это тернарный оператор. Условие истинно, верните первое выражение, иначе верните второе выражение.
это первый раз, когда я слышу тернарную операцию ... Большое вам спасибо, ребята, ответ очень полезен
Вы можете использовать два цикла for в сочетании с индексами +/-, чтобы упростить себе жизнь.
Хотя стоит упомянуть, что если ваше число 1 или 2, результат будет [*] или [*, *] соответственно. Не был уверен, как ты хотел с этим справиться.
var Exercise1 = (num) => {
let arr = [];
if (num % 2) {
for(i=0;i<num;i++){arr.push((i==~~(num/2))?'*':'');}
} else {
for(i=0;i<num;i++){arr.push((i==(num/2)-1 || i==(num/2))?'*':'');}
}
return arr;
}
console.info('Even (4): ['+Exercise1(4)+']');
console.info('Odd (5): ['+Exercise1(5)+']');
Прежде всего, вы используете
numкак массив (доступ кlengthи тому подобному), но это параметр, и из того, что я вижу, должно быть число.