2012-03-30 44 views
2

是否有任何等價的metod使得像php mysql_fetch_array while js循環?while(var row = fn());

在PHP

你可以這樣做:

<?php 
while ($row = mysql_fetch_array($result)) { 
    echo "my name is " . $row['name'] . " and i'm " . $row['age'] . " yeas old"; 
} 
?> 

我有這樣的對象/數組:

function fetch_array(arr) { 
    // My magic fn that dose not work well, b/c it change the orginal refence 
    return arr.shift(); 
} 
var result = [{ 
    name: "Bob", 
    age: 12 
}, { 
    name: "Jim", 
    age: 18 
}] 

// And want to do: 


while (row = fetch_array(result)) { 
    alert("my name is " + row["name"] + " And I'm " + row['age'] + " years old"); 
} 

// returns zero :(​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ dont want that 
console.log(result.length); 
+0

您的代碼完美的作品... – 2012-03-30 14:42:04

+0

做,我認爲他們想要的陣列將保持不變。 – geekchic 2012-03-30 14:42:34

+0

記得聲明變量'row',否則它將是一個隱式的全局變量。 – Zirak 2012-03-30 15:10:22

回答

1

Array.shift刪除數組的第一個元素,所以當你完成它通過循環像那樣,它是空的。

如果你想要做的是通過它,使用數據,試試這個:

var row; 
for (var i = 0, l = result.length; i < l; i++) { 
    row = result[i]; 
    alert("my name is " + row["name"] + " And I'm " + row['age'] + " years old"); 
} 

// returns 2 
console.log(result.length); 

或改變fetch_array功能這一點,並保留其餘的,因爲它是:

var index = 0; 
function fetch_array(arr){ 
    return arr[index++]; 
} 

如果您想循環遍歷它,您將不得不將索引變量重置爲0。

+0

我想能夠使用while(fn)方法,所以secound建議更好,但我更喜歡單個fn並且沒有全局變量(如果您使用相同的方法兩次) – Endless 2012-03-30 14:55:10

0

您可以在循環中使用陣列項目,以便您可以隨時重新創建它。或者在使用fetch_array函數之前複製它。

或者只是循環遍歷數組。

0

根據什麼瀏覽器的喜悅要支持,array.forEach可能是一個選項:

result.forEach(function(row) { 
    alert("my name is " + row["name"] + " And I'm " + row['age'] + " years old"); 
}); 

或者,如果你使用jQuery:

$(result).each(function() { 
    var row = this; 
    alert("my name is " + row["name"] + " And I'm " + row['age'] + " years old"); 
}); 
+0

不想使用任何3d黨的lib。 它並不是一個真正的數組,我正在使用這只是一個例子 – Endless 2012-03-30 14:50:49

+0

在這種情況下,您可能需要一個for循環或執行類似於@Fabrizio正在執行的操作。但是,在該說明中,不是'mysql_fetch_row'破壞性的,因爲你不能向後尋找?如果是這樣,你目前的實施是一個準確的轉換。 – 2012-03-30 15:00:37

4

我這樣

改變你的 fetch_array功能
function fetch_array(arr) { 
    var i = fetch_array.i || 0; 
    fetch_array.i = ("undefined" === typeof arr[i])? 0 : i + 1; 
    return arr[i]; 
} 

這讓您不想改變陣列。我們的想法是一個索引屬性附加和增加的功能本身

編輯:我已經到達數組末尾時重置索引,否則你將無法循環不止一次在相同(或不同)«結果集»,例如

while(row = fetch_array(result)){ 
    alert("my name is " + row["name"] + " And I'm " + row['age'] + " yo"); 
} 

while(row = fetch_array(result)){ 
    alert("here again the name " + row["name"] + " and age: " + row['age']); 
} 

console.log(result.length); // returns 2; 

爲一邊記,重置指數的條件可以也

fetch_array.i = (i === arr.length)? 0 : i + 1; 
+0

stile劑量不解決while(fn){while(fn()){}} – Endless 2012-03-30 15:49:42

+0

你能制定一個你想要完成什麼樣的例子嗎?發表一個小提琴 – fcalderan 2012-03-30 15:51:37

+0

看我的例子http://jsfiddle.net/YdVbS/1/ – Endless 2012-03-30 16:04:44