Как остановить цикл JavaScript for?


я использую этот 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 75

3 ответа:

чтобы остановить a 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 (aka ES6), для этого конкретные use case, вы можете использовать Array#findIndex (найти индекс записи) или Array#find (найти саму запись), оба из которых могут быть обернуты/polyfilled:

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 если callback-функция не возвращает значение ИСТИНА. Array#find также останавливается, когда он находит то, что вы ищете, но он возвращает запись, а не его индекс (или undefined если callback-функция не возвращает значение ИСТИНА).

если вы используете 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
    }
});

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

remIndex = -1;

for (i = 0; i < remSize.length; i++) {      
    if (remSize[i].size == remData.size) {
        remIndex = i
        break;
    }
}

используйте для цикла вместо этого, который является частью выпуска 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);
}