【问题标题】:Looping through array and output as pairs (divider for each second element)循环遍历数组并成对输出(每个第二个元素的除法器)
【发布时间】:2012-06-02 22:25:10
【问题描述】:

我有一个包含匿名元素的数组。元素通过 php 添加到数组中,如下所示:

$playlist = array();

while (databaseloop) {
  $playlist[] = $a_title;
  $playlist[] = $a_length;
}

echo json_encode(array('playlist'=>$playlist));

所以数组变成:

["Hello.mp3", "00:00:14", "Byebye.mp3", "00:00:30", "Whatsup.mp3", "00:00:07", "Goodnight.mp3", "00:00:19"] and so on

然后我用 ajax post 在 jquery 中检索这个数组。一切正常。

现在,我正在寻找一种在 javascript/jquery 中将所有数组元素作为对处理/输出的方法。为每个第二个元素“做某事”。像这样:

foreach (two_elements_in_array) {
  // output track name
  // output track time
  // output some divider
}

如何做到这一点?

【问题讨论】:

    标签: javascript jquery arrays foreach


    【解决方案1】:

    嗯,也许这是最基本的解决方案:

    for (var i = 0; i < arr.length; i += 2) {
        var title = arr[i];
        var len = arr[i+1];
    }
    

    不过,我建议你安排$playlist如下:

    while (databaseloop) {
        $playlist[] = array(
            "title" => $a_title,
            "length" => $a_length
        );
    }
    

    然后很容易迭代元素:

    for (var i = 0; i < arr.length; i++) {
        var title = arr[i]['title'];
        var len = arr[i]['length'];
    }
    

    【讨论】:

      【解决方案2】:

      您可以将数组拆分为一个由两个元素组成的数组。

      var arr = ["Hello.mp3", "00:00:14", "Byebye.mp3", "00:00:30", "Whatsup.mp3", "00:00:07", "Goodnight.mp3", "00:00:19"];
      arr.map(function(elem,i,arr){return [elem, (i+1<arr.length) ? arr[i+1] : null];})
          .filter(function(elem,i){return !(i%2);});
      

      【讨论】:

        【解决方案3】:

        使用Array.prototype.reduce():

        let pairs = playlist.reduce((list, _, index, source) => {
            if (index % 2 === 0) {
                list.push(source.slice(index, index + 2));
            }
            return list;
        }, []);
        

        这为您提供了一个二维数组pairs

        【讨论】:

          【解决方案4】:

          不适用于foreach

          for (var i = 0; i < array.length; i += 2) {
              var name = array[i];
              var time = array[i + 1];
              // do whatever
          }
          

          【讨论】:

          • “不带foreach”是什么意思?
          • 这意味着foreach 不适合在这种情况下使用。
          【解决方案5】:

          一个增量为 2 的简单 for 循环。您可能需要确保您的数组长度足以容纳 i+1,以防长度不能被 2 整除!

          for (i = 0; i+1 < array.length; i+=2) {
            name = array[i];
            length = array[i+1];
          }
          

          【讨论】:

            【解决方案6】:
            var arr = ["Hello.mp3", "00:00:14", "Byebye.mp3", "00:00:30", "Whatsup.mp3", "00:00:07", "Goodnight.mp3", "00:00:19"];
            
            var group = [];
            for (var x = 0; x < arr.length; x += 2) {
                var track = arr[x],
                    length = arr[x + 1];
                group.push({
                   track: track,
                   length: length
                })
            }
            

            【讨论】:

              【解决方案7】:

              如果可能的话,我建议您进一步优化您的代码,使其更有意义并且不易出错。 这也是更加面向对象的好方法!

              像这样(我在这里使用 jQuery):

              var array = [ {name: "Hello.mp3", time: "00:00:14"}, {name: "Byebye.mp3", time:"00:00:30"}, {name: "Whatsup.mp3", time: "00:00:07"}, {name: "Goodnight.mp3", time: "00:00:19"}];
              

              然后你就可以循环它并生成看起来更干净的代码

              array.forEach(function(data){
                  //edit the output here
                  console.log(data.name + " " + data.time );  
              });
              

              【讨论】:

                【解决方案8】:

                正如@VisioN 所说,如果您使用关联数组会更容易,否则您可以在客户端迭代时拥有一个单独的标签数组

                var d=["Hello.mp3", "00:00:14", "Byebye.mp3", "00:00:30", "Whatsup.mp3", "00:00:07", "Goodnight.mp3", "00:00:19"] ;
                var e=["name","time"];
                var c=0;
                $.each(d,function(i,j){
                    if(c>=2)c=0;
                    console.log(e[c]+j);
                    c++;
                });
                

                http://jsfiddle.net/FmLYk/1/

                【讨论】:

                  【解决方案9】:

                  破坏性,但干净:

                  while (arr.length) {
                    const Title  = arr.shift();
                    const Length = arr.shift();
                  
                    // Do work.
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-10-22
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-01-20
                    • 2012-01-04
                    • 2020-08-08
                    • 1970-01-01
                    • 2020-12-22
                    相关资源
                    最近更新 更多