2016-09-10 6 views
1

КакОпределить переменную внутри во время цикла

while (
    stack.peek() in ops && 
    p(stack.peek()) >= 10 
) { 
    str += stack.pop(); 
} 

переписано так я называю .peek() каждый раз, когда проходит цикл, но только определить его один раз?

Я думал о

const peek = stack.peek(); 
while (
    peek in ops && 
    p(peek) >= 10 
) { 
    str += stack.pop(); 
} 

, но так как я могу изменить stack с stack.pop() внутри цикла в то время, я думаю, значение stack.peek() меняется каждый раз, так что я думаю, я должен переопределить переменную внутри цикла , но

let peek = stack.peek(); 
while (
    peek in ops && 
    p(peek) >= 10 
) { 
    str += stack.pop(); 
    peek = stack.peek(); 
} 

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

while (
    let peek = stack.peek() && 
    peek in ops && 
    p(peek) >= 10 
) { 
    str += stack.pop(); 
} 

или

for (
    let peek = stack.peek(); 
    peek in ops && p(peek) >= 10; 
    peek = stack.peek() 
) { 
    str += stack.pop(); 
} 
+1

Ну, второй в последнем примере синтаксически неверно, так что идти с 'for' петли вместо этого? Мне непонятно, в чем проблема. Использовать любой код? –

+0

@Jamgreen. Я выстрелил. Дайте мне знать, что вы думаете. –

+0

@Jamgreen Что вы подразумеваете под словом «но только определить его один раз?» ? – guest271314

ответ

1

Рассмотрите возможность использования с while (true)break:

while (true) { 
    const peek = stack.peek(); 
    if (!(peek in ops) || p(peek) < 10) break; 
    str += stack.pop(); 
} 

В теории можно также сделать:

while (
    (peek => peek in ops && p(peek) >= 10)(stack.peek()) 
) { 
    str += stack.pop(); 
} 

но это довольно некрасиво. Это примерно эквивалентно написать

function pop(stack) { 
    const peek = stack.peek(); 
    return peek in ops && p(peek) >= 10; 
} 

while(pop(stack)) str += stack.pop(); 

for петля не плохая идея либо, и может быть записана в виде:

for (let peek; peek = stack.peek(), peek in ops && p(peek) >= 10;) { 
    str += stack.pop(); 
} 

который снова уклоняется дублирующего вызов stack.peek().

+0

Я пошел с подходом 'while (true)': D я изменил его на 'while (stack.length> 1) {const peek = stack.peek(); if (peek in ops && p (peek)> = 10) {str + = stack.pop(); } else {break; }} '. – Jamgreen

+0

@ Это кажется сложным. Решение много, много, гораздо проще. –

+0

@ AnthonyRutledge Предоставленные решения не кажутся более сложными, чем исходный вопрос? – guest271314

0

Как минимум, это должно работать.

var peek = stack.peek(); //Declaration (once) and initialization 

while ((peek in ops) && (p(peek) >= 10)) 
{ 
    str += stack.pop(); 
    peek = stack.peek() //Re-assignment after modifying stack. 
} 

Определить переменную перед состоянием цикла, а затем обновить переменную в качестве последнего оператора внутри цикла. Я уверен, что вы в конце концов пришли бы к этому решению. :-)

+0

Этот ответ - лучший ответ, руки вниз. – Melinda

1

Как

while (
    stack.peek() in ops && 
    p(stack.peek()) >= 10 
) { 
    str += stack.pop(); 
} 

переписано так я называю .peek) каждый раз, когда проходит цикл (, но только определить это один раз?

Извините за консуинство. Я создал Array.prototype.peek =() => этот [this.length - 1]. Неправильно ли «беспорядок» с Array.prototype?

Обратите внимание,

var stack = [1,2,3]; 
stack.peek(); 

вернулся 3, здесь, используя ключевое слово function.

Array.prototype.peek = function() { return this[this.length - 1]} 

с помощью функции стрелка

Array.prototype.peek =() => this[this.length - 1]; stack.peek() 

вернулся undefined


Вы можете альтернативно использовать выражение stack.length -1 как условие внутри while цикла; например.;

var stack = [-2, -1, 0, 1, 2, 3, 4, 5], 
 
    n = 0; 
 

 
while (stack.length - 1 && (peek = stack.pop())) { 
 
    // do stuff 
 
    n += (curr = peek * 10) >= 10 ? curr : n; 
 
    delete curr; 
 
    console.log(`peek:${peek}`); 
 
} 
 

 
console.log(`n:${n}, peek:${peek}`);