while(var row = fn());

时间:2012-03-30 14:38:49

标签: php javascript

在js循环中是否有类似于php mysql_fetch_array的等效方法?

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

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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.

答案 2 :(得分:0)

您的循环中有数组项,因此您可以随时重新创建它。或者只是在使用fetch_array功能之前复制它。

或者只是循环遍历数组。

答案 3 :(得分: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");
});