как его сломать.каждая функция в подчеркивании.js
Я ищу способ остановить итерации подчеркивания.js _.each()
метод, но не могу найти решение. jQuery .each()
может сломаться, если вы делаете return false
.
есть ли способ остановить подчеркивание каждого ()?
_([1,2,3]).each(function(v){
if (v==2) return /*what?*/;
})
11 ответов:
вы не можете вырваться из
each
метод-он эмулирует роднойforEach
поведение метода, и роднойforEach
не обеспечивает выход из цикла (кроме создания исключения).однако, все надежды не потеряны! можно использовать
Array.every
метод. :)из этой ссылки:
every
выполняет предусмотренногоcallback
функцию один раз для каждого элемента в массиве, пока не найдет гдеcallback
возвращает значение false. Если такой элемент найден, тоevery
метод немедленно возвращает false.другими словами, вы могли бы сделать что-то замысловатое вроде этого (ссылка на JSFiddle):
[1, 2, 3, 4].every(function(n) { alert(n); return n !== 3; });
это предупредит
1
через3
, а затем "вырваться" из цикла.вы используете подчеркивание.js, так что вам будет приятно узнать, что это тут предоставить
every
способ-они называют этоevery
, но поскольку эта ссылка упоминает, они также предоставляют псевдоним под названиемall
.
обновление:
_.найти было бы лучше, поскольку он выходит из цикла, когда элемент найден:
var searchArr = [{id:1,text:"foo"},{id:2,text:"bar"}]; var count = 0; var filteredEl = _.find(searchArr,function(arrEl){ count = count +1; if(arrEl.id === 1 ){ return arrEl; } }); console.log(filteredEl); //since we are searching the first element in the array, the count will be one console.log(count); //output: filteredEl : {id:1,text:"foo"} , count: 1
** старая **
Если вы хотите условно выйти из цикла, используйте _.фильтр api вместо _.каждый. Вот фрагмент кода
var searchArr = [{id:1,text:"foo"},{id:2,text:"bar"}]; var filteredEl = _.filter(searchArr,function(arrEl){ if(arrEl.id === 1 ){ return arrEl; } }); console.log(filteredEl); //output: {id:1,text:"foo"}
вы можете посмотреть
_.some
вместо_.each
._.some
останавливает обход списка, как только предикат истинен. Результат(ы) может быть сохранен во внешней переменной._.some([1, 2, 3], function(v) { if (v == 2) return true; })
может быть, вы хотите подчеркнуть любой () или найти (), который остановит обработку при выполнении условия.
Как и другие ответы, это невозможно. Вот комментарий о выключателе в подчеркивании подчеркивание проблема #21
вы не можете сломать
forEach
в подчеркивании, поскольку он эмулирует собственное поведение EcmaScript 5.
Я считаю, что если Ваш массив был на самом деле объект, который вы могли бы вернуть с помощью пустого объекта.
_.({1,2,3,4,5}).each(function(v){ if(v===3) return {}; });
также хорошо отметить, что каждый цикл не может быть разорван из - к перерыв, использование _.найти вместо этого.
обновление:
вы можете фактически "сломать", бросив ошибку внутрь и поймав ее снаружи: что-то вроде этого:
try{ _([1,2,3]).each(function(v){ if (v==2) throw new Error('break'); }); }catch(e){ if(e.message === 'break'){ //break successful } }
это, очевидно, имеет некоторые последствия в отношении любых других исключений, которые ваш код запускает в цикле, поэтому используйте с осторожностью!