2015-08-05 4 views
1

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

массив дается, и я не могу изменить его, currntly, когда условие истинно цикл продолжается обработка ...

https://jsfiddle.net/z4oxsa1b/10/

var json = { 
    "prov": [ 
    { 
     "save": { 
     "pa": "aa", 
     "func": "sa" 

     }, 
     "delete": { 
     "pa": "sof", 
     "func": "delete" 

     } 
    } 
    ] 
}; 

var array = []; 
array.push(json); 

_.filter(array, function (config) { 
    config['prov'].some(function (provider) { 
     _.every(provider, function (config) { 
      if (config.pa === 'aa') { 
       //now need to exit 
       console.log("true") 
      } 
     }); 
    }); 
}); 

UPDATE: ответы не помогают, предположим, что я звоню в петлю фильтра внутри метода. Я хочу, чтобы вышел из этогометод, если условие if истинно ...

+1

Можете ли вы объяснить предложение предложением этих циклов, пожалуйста? – Xartok

+1

Вы не 'фильтруете список, проверяя, что' some'thing в списке передает условие или проверяя, что элемент 'every' в списке передает условие, потому что у вас нет возвратных операторов в предикатах и ​​вы не пытаетесь используйте эти возвращаемые значения. Каково намерение кода? –

+0

Ответы Помогите: вы думаете о процедурной и письменной функции. Поэтому вам придется либо начать думать о функциональности, либо писать процедурные, о которых я прямо предложил. Мы можем показать вам воду, но никто не может заставить вас ее выпить. –

ответ

-4

Попробуйте команду останова (чуть ниже console.log ("истинного"))

перерыва;

+0

Вы не можете использовать методы перекоса в методах подчеркивания – Kenny

1

Вы можете просто выйти из функции _.every, используя return.

_.every(provider, function (config) { 
    if (config.pa === 'aa') { 
     //now need to exit 
     console.log("true") 
     return; // --> just return 
    } 
}); 
+0

Технически правильно, но это не помогает, если (позже по дороге), у него есть некоторый код после цикла, который необходимо выполнить. Возврат сразу же выходит из функции. – Gunnar

+0

Я не уверен, что я получу ваш комментарий, вы можете привести пример? Вопрос заключается в том, как разбить итерацию, 'return' будет делать именно это и продолжить из строки после цикла (' _.every'). Не сильно отличается от использования цикла 'for' с' break'. –

+0

@StoyanDekov - спасибо, но он не работает после того, как я вернусь, цикл все еще работает для дополнительных значений, я хочу выйти из этих циклов ... предположим, что я вызываю метод isnide фильтра, выйдя из этого метода с помощью boolean true –

-1

Вы должны взглянуть на инструкции Break and Continue в JavaScript.

_.filter(array, function (config) { 
    config['prov'].some(function (provider) { 
    _.every(provider, function (config) { 
     if (config.pa === 'aa') { 
     //now need to exit 
     break; // exits the if statement 
     console.log("true") 
     } 
    }); 
    }); 
}); 
+1

Похоже, вы тоже должны прочитать документацию;). – Teemu

+0

Спасибо, но это просто выйдите из if, если я хочу выйти из всех циклов, предположим, что я вызываю метод isnide фильтра. Выйдите из этого метода с помощью boolean true –

+0

, кроме того, когда я поставил перерыв, как вы говорите, я получил ошибку. Нелегальный оператор break –

0

Здесь вы не используете петли. Вы используете функции более высокого порядка. break, return или continue не помогут.

Идея этих функций более высокого порядка состоит в том, что вы беспокоитесь о том, что они прерывают цикл или нет: такие заботы ложатся на реализацию библиотечной функции. По сути, это именно то, что делает это реализация: https://github.com/jashkenas/underscore/blob/master/underscore.js#L244-L255

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

Еще одна вещь, намекающая на необходимость чтения документации по функциям, заключается в том, что предикат внутри every должен вернуть значение. На данный момент вы возвращаете undefined все время. Аналогично, Javascript по умолчанию не возвращает значение последнего выражения функции. Поэтому _.every и config.prov.some(... должны предшествовать инструкции return.

Другой выход может состоять в том, чтобы на самом деле использовать контуры Javascript good'ol, упрощая торговую лаконичность, если вам удобнее процедурный стиль вместо функционального стиля; там вы сможете использовать встроенные модули. Маркированные петли могут помочь, если вы хотите нарушить внешний цикл.

+0

(отредактированный, чтобы сместить акцент на OP, возможно, отсутствует фактическая точка, после того, как я снова прочитал вопрос) –

Смежные вопросы