#javascript #arrays #loops #logical-operators
Вопрос:
в чем проблема этого кода? это показывает ложь. это должно быть правдой.
function isSpecialArray(arr) {
for(i=0; i<arr.length; i ){
return ((arr[i % 2 == 0]) % 2 == 0) amp;amp; ((arr[i % 2 !==0]) % 2 !== 0)
}
}
console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3])) // false??
Комментарии:
1. Ваше
return
утверждение вfor
цикле означает, что ваша функция вернется после изучения только первого элемента массива;return
немедленно завершает работу функции.2. Есть какие-либо предложения , чтобы сделать цикл достойным изучения каждого элемента, кроме каждого метода массива ?
3. Используйте
if
иreturn false
для недопустимой записи в цикле. После петлиreturn true
.4. Вы можете сделать это в одной строке и сэкономить ненужные циклы, если используете
Array.prototype.every()
:function isSpecial(arr) { return arr.every((item, index) => item % 2 === index % 2); }
Ответ №1:
Вы можете упростить свой код и избежать ненужных циклов, как только будет найден первый элемент, нарушающий правило.
Использование for
цикла
function isSpecial(arr) {
for (let i = 0; i < arr.length; i ) {
if (arr[i] % 2 !== i % 2) return false
}
return true;
}
С помощью Array.prototype.every
function isSpecial(arr) {
return arr.every((item, index) => item % 2 === index % 2);
}
Ответ №2:
Ваш return ((arr[i % 2 == 0]) % 2 == 0) amp;amp; ((arr[i % 2 !==0]) % 2 !== 0)
синтаксис неверен. Надеюсь, что приведенная ниже функция соответствует вашим требованиям.
Логические
- Пройдитесь по массиву, проверьте каждый узел на наличие «особого» состояния и сохраните его в
isNodeSpecial
- «специальное» условие означает, что четный индекс имеет четное число, а нечетный индекс имеет нечетное число.
- Инициализируйте переменную вне цикла, которая содержит
isSpecial
статус массива. - Обновите значение isSpecial, изменяемое как логическое и
isSpecial
иisNodeSpecial
. - Всякий раз, когда один узел нарушает условие
isSpecial
, устанавливается значение false, и цикл завершается.
function isSpecialArray(arr) {
let isSpecial = true;
for (i = 0; i < arr.length amp;amp; isSpecial; i ) {
const isNodeSpecial = (i % 2 === 0) ? arr[i] % 2 === 0 : arr[i] % 2 === 1;
isSpecial = isSpecial amp;amp; isNodeSpecial;
}
return isSpecial;
}
console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3])); // true
console.log(isSpecialArray([2, 7, 4, 10, 6, 1, 6, 3]));// false
Ответ №3:
Вы можете проверить, не удовлетворяет ли какой-либо элемент условию, и немедленно вернуться false
. Если все элементы удовлетворяют условию, то возвращайтесь true
. Это лучшее решение, когда дело доходит до производительности. Вы можете изменить свой код следующим образом:
function isSpecialArray(arr) {
for (i = 0; i < arr.length; i ) {
if (arr[i] % 2 !== i % 2) return false;
}
return true;
}
console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3])) //true
console.log(isSpecialArray([1, 7, 4, 9, 6, 1, 6, 3])) //false
Комментарии:
1. Почему это чрезмерно сложное состояние в
if
?if (i % 2 !== arr[i] % 2) return false
2. Вы совершенно правы, позвольте мне упростить это. Tnx.
Ответ №4:
то, что вы делаете, неправильно, потому что ваш код вернется сразу после первого выполнения цикла, самое простое, что вы можете сделать, — это ввести условие if внутри цикла и проверить, является ли ваш нечетный элемент индекса нечетным или четным, элемент индекса четным, и вернуть false, если ваш элемент неправильный, и продолжать проверять весь массив и возвращать true вне цикла, если массив особенный.
function isSpecialArray(arr) {
for(i=0; i<arr.length; i ){
if(!((i%2==0 amp;amp; arr[i]%2==0) || (i%2==1 amp;amp; arr[i]%2==1))) {
return false;
}
}
return true;
}
Спасибо
Ответ №5:
arr[i % 2 == 0] //returns undefined, b/c you are trying to do arr[true]
undefined % 2 //returns NaN
NaN == 0 //returns false, so you always get false
Также верно и то, что другие говорят о том, что цикл сразу же обрывается, но это не главная проблема.
Попробуйте это вместо этого:
function isSpecial(element, index) {
if(index%2 == 0) {
return element%2 == 0
}
else {
return element%2 != 0
}
}
function isSpecialArray(arr) {
return arr.every(isSpecial);
}
console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3])) // true
console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 4])) // false
Ответ №6:
просто сделайте прямой путь :
const isSpecialArray = arr => arr.every((v,i)=>i%2===v%2)
console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3])) // true
console.log(isSpecialArray([1, 7, 4, 9, 6, 1, 6, 3])) // false
та же идея с array.reduce():
const isSpecialArray = arr =>
arr.reduce((r,v,i)=>r amp;amp; ((i%2) === (v%2)), true)
console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 3]))
console.log(isSpecialArray([2, 7, 4, 9, 6, 1, 6, 4]))
Комментарии:
1. Могу я спросить вас , есть ли какая-то особая причина, по которой вы предлагаете
reduce()
закончитьevery()
, пожалуйста? Мне в этом случаеreduce()
кажется менее интуитивным и читаемым. Заранее благодарю вас за ваш ответ. 🙂2. @secan нет, вы не найдете для этого никакой «особой» причины. И есть ли у вас особая причина просить меня обосновать ответ, который вам явно не нравится?
3. Мне не нравится ваш ответ; Мне просто было интересно, была ли для этого какая-то особая причина (например, производительность), поэтому я спросил. Я самоучка и довольно посредственный разработчик, без формального образования в области CS и большого количества пробелов в знаниях-особенно в том, что касается более теоретических тем, — поэтому, когда я вижу, что более опытный разработчик предлагает решение, о причине которого я не могу догадаться, я спрашиваю в надежде лучше понять и, возможно, чему-то научиться. Я не хотел критиковать или принижать вас, и я прошу прощения, если я произвел такое впечатление (английский не мой родной язык).
4. @secan : ранг : 48