Помогите сократить некрасивый код
Как сделать две проверки при помощи циклов? Нужно проверить, чтобы были введены числа, при этом разные и говорилось, в чем ошибка, в голову пришло только такое, выглядит убого, есть ли варианты сократить? Очень не хочется приучатся к быдлокоду
while(isNaN(a) || isNaN(b) || isNaN(c) || (a === b) || (b === c) || (c === a)){ while(isNaN(a) || isNaN(b) || isNaN(c)){ alert('можно вводить только числа'); a = +prompt('число 1'); b = +prompt('число 2'); c = +prompt('число 3'); } while((a === b) || (b === c) || (c === a)){ alert('числа должны быть разные'); a = +prompt('число 1'); b = +prompt('число 2'); c = +prompt('число 3'); } } |
var a,b,c,d,e; while((d = isNaN(a * b * c)) || (e = (a == b) || (b == c) || (c == a))) { alert(d ? 'можно вводить только числа' : 'числа должны быть разные'); a = prompt('число 1') || NaN; b = prompt('число 2') || NaN; c = prompt('число 3') || NaN; } |
verynew,
function fn(length, array) { array = array || []; var a = array.length + 1, a = +prompt("число " + a,""); isNaN(a) && (a = "можно вводить только числа"); - 1 !== array.indexOf(a) && (a += " это число уже есть : "+array+" ,введите другое"); a == +a ? (--length, array.push(a)) : alert(a); return length ? fn(length, array) : array }; alert(fn(3)); |
смысл тот же, что у рони :)
alert(promptNumbers(3)); /** * @param {Number} count * @returns {Array<Number>} */ function promptNumbers(count) { let arr = new Array(count); for (let i = 0, n; i < count; i++) { while (true) { n = Number(prompt('Enter a number')); if (isNaN(n)) { alert(`It is not a number!`); continue; } if (contains(arr, n)) { alert(`The number "${n}" already exists!`); continue; } arr[i] = n; break; } } return arr; } function contains(arr, needle) { return arr.indexOf(needle) !== -1; } |
nerv_,
а если while(true) заменить на for(let i = 0, n; i < count;) //... arr[i++] = n;? |
рони, то не будет удовлетворять требованиям из первого поста :) Первый цикл обеспечивает количество, второй бизнес-логику. Собственно, второй цикл можно вынести в отдельную функцию при желании.
Там просто форматирование куда-то улетело. Я прошелся бьютифайером и обновил код выше. |
nerv_,
не понял твоего сообщения, всё же работает, что не так? alert(promptNumbers(3)); /** * @param {Number} count * @returns {Array<Number>} */ function promptNumbers(count) { let arr = new Array(count); for (let i = 0, n; i < count; ) { n = Number(prompt('Enter a number')); if (isNaN(n)) { alert(`It is not a number!`); continue; } if (contains(arr, n)) { alert(`The number "${n}" already exists!`); continue; } arr[i++] = n; } return arr; } function contains(arr, needle) { return arr.indexOf(needle) !== -1; } |
Вариант nerv без for
alert(promptNumbers(3)); /** * @param {Number} count * @returns {Array<Number>} */ function promptNumbers(count) { let arr = new Array(count), i = 0; while (i < count) { n = Number(prompt('Enter a number')); if (isNaN(n)) { alert(`It is not a number!`); continue; } if (contains(arr, n)) { alert(`The number "${n}" already exists!`); continue; } arr[i] = n; i++; } return arr; } function contains(arr, needle) { return arr.indexOf(needle) !== -1; } |
Часовой пояс GMT +3, время: 21:17. |