Это может быть альтернатива:
$className = '%' . $this->className . '%';
$query->bind_param('s', $className);
Также как Perl,
loop1:
for (var i in set1) {
loop2:
for (var j in set2) {
loop3:
for (var k in set3) {
break loop2; // breaks out of loop3 and loop2
}
}
}
, как определено в разделе 12.12 EMCA-262. [MDN Docs]
В отличие от C эти метки могут использоваться только для continue
и break
, поскольку Javascript не имеет goto
.
Я немного опаздываю на вечеринку, но следующий язык - агностический подход, который не использует GOTO / ярлыки или обертывание функций:
for (var x = Set1.length; x > 0; x--)
{
for (var y = Set2.length; y > 0; y--)
{
for (var z = Set3.length; z > 0; z--)
{
z = y = -1; // terminates second loop
// z = y = x = -1; // terminate first loop
}
}
}
. Поверхность протекает естественно, что должен понравиться толпе не-GOTO. С другой стороны, внутренний цикл должен завершить текущую итерацию до завершения, чтобы в некоторых сценариях она не применима.
break
или continue
сразу после установки z и y? Мне нравится идея использовать условия цикла for
для выхода. Элегантный по-своему.
– Ben Sutton
7 December 2015 в 19:01
Оберните это в функцию, а затем просто return
.
лучший способ - 1) Сортировка обоих массивов, которые используются в первом и втором циклах. 2) если элемент согласован, то разбить внутренний цикл и удерживать значение индекса. 3) при запуске следующей итерации запустите внутренний цикл с индексом удержания.
Как об использовании каких-либо разрывов вообще, никаких флажков отмены и никаких дополнительных проверок условий. Эта версия просто взрывает переменные цикла (делает их Number.MAX_VALUE
), когда условие встречается, и заставляет все петли прекращать элегантно.
// No breaks needed
for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
if (condition) {
console.log("condition met");
i = j = Number.MAX_VALUE; // Blast the loop variables
}
}
}
Был найден аналогичный ответ для вложенного типа типа декрементирования петли, но это работает для вложенных циклов инкрементного типа, не требуя рассмотрения значения конца цикла для простых циклов.
Другой пример:
// No breaks needed
for (var i = 0; i < 89; i++) {
for (var j = 0; j < 1002; j++) {
for (var k = 0; k < 16; k++) {
for (var l = 0; l < 2382; l++) {
if (condition) {
console.log("condition met");
i = j = k = l = Number.MAX_VALUE; // Blast the loop variables
}
}
}
}
}
var str = "";
for (var x = 0; x < 3; x++) {
(function() { // here's an anonymous function
for (var y = 0; y < 3; y++) {
for (var z = 0; z < 3; z++) {
// you have access to 'x' because of closures
str += "x=" + x + " y=" + y + " z=" + z + "<br />";
if (x == z && z == 2) {
return;
}
}
}
})(); // here, you execute your anonymous function
}
Как это? :)
x
, если какая-либо логика в цикле ссылается на x в более поздний момент времени (например, она определяет внутреннюю анонимную функцию, которая сохраняется и выполняется позже), значение для x будет быть тем, что было в конце цикла end i>, а не индексом, который была определена во время. (Продолжение)
– devios1
31 May 2012 в 22:57
Если вы используете Coffeescript, есть удобное ключевое слово «сделать», которое упрощает определение и немедленно выполняет анонимную функцию:
do ->
for a in first_loop
for b in second_loop
if condition(...)
return
... поэтому вы можете просто использовать «возврат», чтобы выйти из петель.
for
не две.
– Gary Willoughby
19 July 2017 в 20:23
XXX.Validation = function() {
var ok = false;
loop:
do {
for (...) {
while (...) {
if (...) {
break loop; // Exist the outermost do-while loop
}
if (...) {
continue; // skips current iteration in the while loop
}
}
}
if (...) {
break loop;
}
if (...) {
break loop;
}
if (...) {
break loop;
}
if (...) {
break loop;
}
ok = true;
break;
} while(true);
CleanupAndCallbackBeforeReturning(ok);
return ok;
};
довольно просто
var a=[1,2,3];
var b=[4,5,6];
var breakCheck1=false;
for (var i in a){
for (var j in b){
breakCheck1=true;
break;
}
if (breakCheck1) {break;}
}
loop1=loop2=false;
– Muhammad Umer
9 April 2015 в 04:30
Как насчет нажатия петель до их конечных пределов
for(var a=0; a<data_a.length; a++){
for(var b=0; b<data_b.length; b++){
for(var c=0; c<data_c.length; c++){
for(var d=0; d<data_d.length; d++){
a = data_a.length;
b = data_b.length;
c = data_b.length;
d = data_d.length;
}
}
}
}
Я знаю, что это было спрошено 8 лет назад, но в ES6 мы получили цикл для ... , который позволяет использовать стандартные функции прерывания:
for (let item of items) {
if (item.id === id) {
//do something cool
break;
}
}
Я думал, что покажу функционально-программирующий подход. Вы можете вырваться из вложенных функций Array.prototype.some () и / или Array.prototype.every (), как в моих решениях. Дополнительным преимуществом этого подхода является то, что Object.keys()
перечисляет только собственные перечислимые свойства объекта, тогда как «for-in loop также перечисляет свойства в цепочке прототипов» .
Близко к решению OP:
Args.forEach(function (arg) {
// This guard is not necessary,
// since writing an empty string to document would not change it.
if (!getAnchorTag(arg))
return;
document.write(getAnchorTag(arg));
});
function getAnchorTag (name) {
var res = '';
Object.keys(Navigation.Headings).some(function (Heading) {
return Object.keys(Navigation.Headings[Heading]).some(function (Item) {
if (name == Navigation.Headings[Heading][Item].Name) {
res = ("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
return true;
}
});
});
return res;
}
Решение, которое уменьшает итерацию над заголовками / элементами:
var remainingArgs = Args.slice(0);
Object.keys(Navigation.Headings).some(function (Heading) {
return Object.keys(Navigation.Headings[Heading]).some(function (Item) {
var i = remainingArgs.indexOf(Navigation.Headings[Heading][Item].Name);
if (i === -1)
return;
document.write("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
remainingArgs.splice(i, 1);
if (remainingArgs.length === 0)
return true;
}
});
});
Я понимаю, что это действительно старая тема, но поскольку мой стандартный подход еще не здесь, я решил опубликовать его для будущих googlers.
var a, b, abort = false;
for (a = 0; a < 10 && !abort; a++) {
for (b = 0; b < 10 && !abort; b++) {
if (condition) {
doSomeThing();
abort = true;
}
}
}
condition
оценивает true
на первой итерации вложенного цикла, вы все равно выполняете оставшуюся часть из 10 итераций, каждый раз проверяя значение abort
. Это не проблема производительности для 10 итераций, но это будет, скажем, 10 000.
– Robusto
2 December 2013 в 16:53
abort
и выражения. В простых сценариях, которые могут быть прекрасными, но для огромных циклов с gazillion итерациями, которые могут быть проблемой
– Z. Khullah
11 December 2017 в 18:08
goto
ярлык. Вы, по сути, называете цикл и говорите, что я хочу вырваться из такого цикла. – devios1 31 May 2012 в 22:50continue
иbreak
. – Gary Willoughby 12 November 2015 в 22:17