2010-10-10 11 views
0

J'espère que mon code peut s'expliquer, je suis presque là, je suis juste coincé sur la façon de fusionner des données facultatives dans un objet JSON avec plusieurs niveaux (est-ce encore ce que c'est?)Difficulté à comprendre et créer des objets JavaScript dynamiques

//get video list - example: video1.flv;test23.flv;Grabledable.flv 
var files = j('.videos').html().split(';'); 
// assume first we have one video, so no need of playlist 
var isplaylist = false; 
// check if there are actually more than one video 
if (files.length > 1) { 
    isplaylist = true; 
    var playlist = new Array(); // is this right? I want to add this to the video var 
    for (var i in files) { 
     playlist[] = { 
      url: files[i], 
      title: 'Video ' + i 
     }; 
    } 
}; 

//here's where the trouble starts 
var video = { 
    plugins: { 
     controls: { 
      playlist: isplaylist, 
      //i cut out all irrelevant extra data 
     } 
    }, 
    clip: { 

     url: files[0], 
     // ONLY DO THIS IF isplayer == false; 
     wmode: 'opaque', 
     baseUrl: "/video/", 
     autoPlay: false 
    }, 

    // from here on this should only occur if isplayer == true; 
    // following is the way I want it attached from var playlist 
    playlist: [{ 
     url: 'video1.flv', 
     title: 'Video 0' 
    }, 
    { 
     url: 'test23.flv', 
     title: 'Video 1' 
    }, 
    { 
     url: 'Grabledable.flv', 
     title: 'Video 2' 
    }] 
}; 

Mon objectif est le format répertorié ici: http://flowplayer.org/plugins/javascript/playlist.html sous la section de codage JavaScript.

+0

Si vous voulez vraiment créer JSON, vous devez placer les clés entre guillemets '' '. ' –

+0

@Felix Kling: Je suis le format qui est prédéfini ici http://flowplayer.org/plugins/javascr ipt/playlist.html sous la section Codage JavaScript – Moak

+2

Ok, alors vous ne créez pas JSON mais juste un objet JavaScript normal. –

Répondre

1

Si je ne me trompe pas, vous voulez quelque chose comme ceci:

var video = { 
    plugins: { 
    controls: { 
     playlist: false 
    } 
    }, 
    clip: { 
     wmode: 'opaque', 
     baseUrl: "/video/", 
     autoPlay: false 
    } 
} 

// check if there are actually more than one video 
if(files.length > 1){ 
    video.plugins.controls.playlist = true; 
    var playlist = []; 
    for (var i = 0, l = files.length; i < l; i++) 
    { 
    playlist.push({url: files[i], title: 'Video '+ i}); 
    } 
    video.playlist = playlist; 
} 
else { 
    video.clip.url = files[0]; 
} 

Les entrées correspondantes (comme video.playlist ou video.clip.url) sont ajoutées dynamiquement. Ne jamais traverser les tableaux avec la construction for (... in ...)!

+0

ressemble à une petite faute de frappe: le tableau de playlist dans la boucle for n'est pas indexé. – jbeard4

+0

Génial, cela m'a aidé au-delà de cette question spécifique. – Moak

+0

En outre, for..in n'est pas le meilleur moyen d'itérer sur les index dans un tableau: Voir mdc ici pour plus d'informations: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in # section_4 On dirait qu'il utilise jquery pour obtenir les éléments DOM de la vidéo, donc il devrait probablement utiliser la méthode .each() de jquery à la place: http://api.jquery.com/each/ – jbeard4

1
  1. ne pas utiliser for-in for arrays
  2. Utilisez la méthode push pour ajouter de nouveaux éléments à un tableau (le format que vous avez utilisé existe uniquement en PHP)

code:

// assuming you have video declared before 
var video = { ... }; 

//get video list - example: video1.flv;test23.flv;Grabledable.flv 
var files = j('.videos').html().split(';'); 
// assume first we have one video, so no need of playlist 
var isplaylist = false; 
// check if there are actually more than one video 
if (files.length > 1) { 
    isplaylist = true; 
    var playlist = new Array(); 
    for (var i = 0; i < files.length; i++) { 
     playlist.push ({ 
      url: files[i], 
      title: 'Video ' + i 
     }); 
    } 
}; 

video.playlist = playlist;