как его сломать.каждая функция в подчеркивании.js


Я ищу способ остановить итерации подчеркивания.js _.each() метод, но не могу найти решение. jQuery .each() может сломаться, если вы делаете return false.

есть ли способ остановить подчеркивание каждого ()?

_([1,2,3]).each(function(v){
    if (v==2) return /*what?*/;
})
11 192

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;
})

см.http://underscorejs.org/#some

_([1,2,3]).find(function(v){
    return v if (v==2);
})

может быть, вы хотите подчеркнуть любой () или найти (), который остановит обработку при выполнении условия.

Как и другие ответы, это невозможно. Вот комментарий о выключателе в подчеркивании подчеркивание проблема #21

вы не можете сломать forEach в подчеркивании, поскольку он эмулирует собственное поведение EcmaScript 5.

Я считаю, что если Ваш массив был на самом деле объект, который вы могли бы вернуть с помощью пустого объекта.

_.({1,2,3,4,5}).each(function(v){  
  if(v===3) return {}; 
});

также хорошо отметить, что каждый цикл не может быть разорван из - к перерыв, использование _.найти вместо этого.

http://underscorejs.org/#each

обновление:

вы можете фактически "сломать", бросив ошибку внутрь и поймав ее снаружи: что-то вроде этого:

try{
  _([1,2,3]).each(function(v){
    if (v==2) throw new Error('break');
  });
}catch(e){
  if(e.message === 'break'){
    //break successful
  }
}

это, очевидно, имеет некоторые последствия в отношении любых других исключений, которые ваш код запускает в цикле, поэтому используйте с осторожностью!

работала в моем случае

var arr2 = _.filter(arr, function(item){
    if ( item == 3 ) return item;
});