更好的方法来编写for循环

时间:2016-09-20 14:27:41

标签: javascript arrays for-loop foreach

我想遍历数组并使用'如果'检查条件。声明。如果满足条件,则应退出for循环并执行其他语句。在执行其他语句之后,它应该从下一个变量循环。 对于前如果我有一个名为' songs',

的数组
_(songs).forEach(function(song) {
    if (song.genre == 1){
       //do something and exit from for loop 
    }
});
// Do something else

现在我想再次循环并从之前停止的地方开始。我尝试实现如下:

var i = 0;
for(;i < songs.length; i++){
            if(songs[i].genre == 3) {
                //do something
                i++;
                break;
            }
            else if(songs[i].genre == 2) {
                //do something
                i++;
                break;
            }else{
                //do something
                i++;
                break;
            }
        }

它有助于达到目的。但无论如何要使其效率更高或更好?任何建议都会有所帮助:)

3 个答案:

答案 0 :(得分:0)

function doStuffWithSongs(song) {
  switch (song.genre) {
    case 'pop':
      // handle pop songs
      break;

    case 'rock':
      // repeat for every genre
      break;

  }
};

songs.forEach(doStuffWithSongs);

您还可以让doStuffWithSongs成为一系列不同的函数并处理switch中的forEach

songs.forEach(song => {
  switch (song.genre) {
    case 'pop': return handlePopSongs(song);
    case 'rock': return handleRockSongs(song);
    // etc.
  }
});

答案 1 :(得分:0)

有一些对象来保存功能和歌曲

&#13;
&#13;
var songs = [{
    "genre": "pop",
    "name": "Hit me baby"
  }, {
    "genre": "rock",
    "name": "Smoke on the water"
  }],
  handlers = {
    pop: function(song) {
      console.log("pop", song.name);
    },
    rock: function(song) {
      console.log("rock", song.name);
    }
  }
for (var i = 0; i < songs.length; i++) {
  handlers[songs[i].genre](songs[i]);
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

除非出于某种原因需要保留订单?你真的应该在songs数组上运行filter创建一个“流派”数组,然后你可以简单地遍历每个数组,执行你需要发生的任何一个或多个动作。

//SONGS ARRAY
var songs = [
    {
        'name':'Work',
        'genre': 0
    },
    {
        name: 'Blessings',
        genre: 1
    },
    {
        name: 'Blame',
        genre: 0
    },
    {
        name: 'She Got It',
        genre: 0
    },
    {
        name: 'Controlla',
        genre: 1
    },
    {
        name: 'Get Low',
        genre: 1
    }
];

//FILTERED GENRE ARRAYS 
var myRockSongs = songs.filter((o)=>(o.genre === 0) ? true : false);
var myPopSongs = songs.filter((o)=>(o.genre === 1) ? true : false);

//CONSOLE LOG
console.log(myRockSongs);
console.log(myPopSongs);