Как остановить цикл JavaScript для? - PullRequest
99 голосов
/ 23 марта 2012

Я использую этот JavaScript для перебора массива и поиска соответствующего элемента массива:

var remSize = [], 
    szString, remData, remIndex, i;

for (i = 0; i < remSize.length; i++) {      
    // I'm looking for the index i, when the condition is true
    remSize[i].size == remData.size ? remIndex = i : remIndex = -1;     
}

Массив содержит эти "размеры": ["34", "36", "38"...].

remData.size - это размер, который я ищу (например, "36").

Мне нужно вернуть индекс i, если искомый размер находится в индексе. В противном случае мне нужно вернуть -1. Есть ли лучший способ сделать это?

Ответы [ 3 ]

152 голосов
/ 23 марта 2012

Чтобы остановить цикл for на ранних этапах JavaScript, используйте break:

var remSize = [], 
    szString,
    remData,
    remIndex,
    i;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // Set a default if we don't find it
for (i = 0; i < remSize.length; i++) {      
     // I'm looking for the index i, when the condition is true
     if (remSize[i].size === remData.size) {
          remIndex = i;
          break;       // <=== breaks out of the loop early
     }
}

Если вы находитесь в среде ES2015 (также известной как ES6), для этого специфический вариант использования, вы можете использовать Array#findIndex (чтобы найти индекс записи) или Array#find (чтобы найти саму запись), оба из которых могут быть отрегулированы / заполнены:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = remSize.findIndex(function(entry) {
     return entry.size === remData.size;
});

Array#find:

var remSize = [], 
    szString,
    remData,
    remEntry;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remEntry = remSize.find(function(entry) {
     return entry.size === remData.size;
});

Array#findIndex останавливает первый раз, когда обратный вызов возвращает истинное значение, возвращая индекс для этого вызова обратному вызову;он возвращает -1, если обратный вызов никогда не возвращает истинное значение.Array#find также останавливается, когда находит то, что вы ищете, но возвращает запись, а не ее индекс (или undefined, если обратный вызов никогда не возвращает истинное значение).

Если вы используетесовместимая с ES5 среда (или оболочка ES5), вы можете использовать новую some функцию для массивов, которая вызывает обратный вызов до тех пор, пока обратный вызов не вернет истинное значение:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
remSize.some(function(entry, index) {
    if (entry.size === remData.size) {
        remIndex = index;
        return true; // <== Equivalent of break for `Array#some`
    }
});

Если вы используете jQuery, вы можете использовать jQuery.each для циклического перемещения по массиву;это будет выглядеть так:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
jQuery.each(remSize, function(index, entry) {
    if (entry.size === remData.size) {
        remIndex = index;
        return false; // <== Equivalent of break for jQuery.each
    }
});
10 голосов
/ 23 марта 2012

Логика неверна.Он всегда будет возвращать результат последнего элемента в массиве.

remIndex = -1;

for (i = 0; i < remSize.length; i++) {      
    if (remSize[i].size == remData.size) {
        remIndex = i
        break;
    }
}
8 голосов
/ 04 января 2017

Используется вместо цикла, который является частью релиза ES2015.В отличие от forEach, мы можем использовать return, break и continue.Смотри https://hacks.mozilla.org/2015/04/es6-in-depth-iterators-and-the-for-of-loop/

let arr = [1,2,3,4,5];
for (let ele of arr) {
  if (ele > 3) break;
  console.log(ele);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...