Логическая проблема с массивами и для цикла JS - PullRequest
0 голосов
/ 04 июня 2018

Что-то не так с моей логикой или с логикой JS (хаха).
Я действительно не понимаю, почему один из них работает, а другой нет.
Эти функции предназначены для проверкиесли каждый индекс в массиве одинаков.Первый работает, а второй нет, и я не вижу различий в логике этих двух (кроме очевидной точки смены позиций).
1.

function isUniform(x) {
    var first = x[0];
    for(var i = 1; i < x.length; i++) {
        if(first === x[i]) {
            return true;
            i++;
        }
    } return false;
};  

2.

function isUniform(x) {
    var first = x[0];
    for(var i = 1; i < x.length; i++) {
        if(x[i] !== first) {
            return false;
            i++;
        }
    } return true;
};  

Используемые массивы: isUniform ([1, 1, 1, 2]) и isUniform ([1, 1, 1, 1])

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вот разбивка того, как ваши функции работают построчно (я включил комментарии после каждого оператора):

function isUniform(x) {
    var first = x[0]; //SET "FIRST" to first element in array
    for(var i = 1; i < x.length; i++) { //loop from second element to the end
        if(first === x[i]) { //if "FIRST" is equal to this element
            return true; //conclude that the ENTIRE ARRAY is uniform and quit function
            i++; //incremenet "i" (note, the loop automatically does this, so this will result in an extra increment
        }
    } return false; //conclude the array is not uniform IF THE FIRST ITEM IS UNIQUE
}; 

Вот разбивка второй функции:

function isUniform(x) {
    var first = x[0];//SET "FIRST" to first element in array
    for(var i = 1; i < x.length; i++) { //loop from second element to the end
        if(x[i] !== first) { //if this element is not equal to the first CONCLUDE THAT THE ARRAY IS NOT UNIFORM and quit function
            return false;
            i++; //again, extra un-needed increment, but it technically does not matter in this case
        }
    } return true; //CONCLUDE that since no items were NOT equal to the first item, the array is uniform
};  

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

0 голосов
/ 04 июня 2018

Как только вы вернетесь в цикл for, цикл останавливается и функция завершается.

В вашем первом примере first никогда не будет равен x [i], потому что вы начинаете i с 1, а первый=== x [0], поэтому цикл завершится и вернет false.

Во втором примере вы всегда вернете false при i = 1, поскольку x [1]! == x [0], поэтому цикл всегда будет возвращать false после первой проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...