Question

est mon extrait de code, où le programme ne pénètre pas dans la boucle foreach:

var ct = new Array();
ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};
ct.forEach(function (c){
    document.getElementById("tmp").appendChild(document.createTextNode(c));
});

Quand je change les indices de tableau de chaînes ( "moi", "vous") à des entiers, cela fonctionne:

var ct = new Array();
ct[0]= {"name" : "Jakub"};
ct[1]= {"name" : "stack"};
ct.forEach(function (c){
    document.getElementById("tmp").appendChild(document.createTextNode(c));
});

Pouvez-vous me aider à mettre en œuvre la solution à parcourir les tableaux avec toutes sortes d'indices? Mon but est de stocker les valeurs des objets de date.


J'utilise les données pour la bibliothèque Protovis et AFAIK a besoin d'un tableau en entrée.

La structure de données J'utilise dans l'exemple de protovis est plus compliquée que celle indiquée ci-dessus.

Dans mon projet, j'envoyer via JavaBean l'ensemble de certains objets. Les objets contiennent entre autres la date. Mon but est de montrer ces objets sur le graphique comme celui-ci, présenté sur le site Web de protovis http: //. Vis.stanford.edu / protovis / ex / area.html

I utilisera l'axe horizontal pour le temps et l'axe vertical pour le nombre d'objets à un moment donné. Voilà pourquoi je veux avoir le tableau trié par la date, puisque AFAIK protovis ne permet que l'entrée des tableaux de données pour leurs diagrammes en mode par défaut - Enchaînement des fonctions.

modifier: Pour l'instant je changé la méthode. Au lieu de stocker des chaînes comme clés du tableau je suivantes: par le présent est mon extrait de code d'origine:
Edit2 : Je glissai entrée d'origine: var result2 = { "h": { 10 "documents": [ 11 { 12 "biographicalCategories": [ 13], 14 « corps »: «Le gouvernement conservateur de la Grèce a ordonné une enquête sur un accord de 1955 entre les C.I.A. et l'armée grecque pour la mise en place d'un réseau de guérilla pour combattre les forces d'invasion du Pacte de Varsovie en cas d'une guerre », 15 "descripteurs": [ 16], 17 "generalOnlineDescriptors": [ 18], 19 "guid": 0, 20 "titre": "la Grèce Plan pour Enquêter Guerrilla War", 21 "emplacements": [ 22 « Grèce » 23], 24 "noms": [ 25], 26 "onlineDescriptors": [ 27], 28 "onlineLocations": [ 29], 30 "onlineOrganizations": [ 31], 32 "onlinePeople": [ 33], 34 "onlineTitles": [ 35], 36 "organisations": [ 37], 38 "personnes": [ 39], 40 "PublicationDate": "21/11/1990 00: 00: 00.0 CET", 41 "sourceFile": "0402635.xml", 42 "taxonomicClassifiers": [ 43], 44 "titres": [ 45], 46 "typesOfMaterial": [ 47], 48 "score": 0,80242133 49},


var resultTmp = new Array();
var i = 0;
var averageScore = 0; 

var startDate = new Date();
var endDate = new Date(1700, 01, 01);
var docDate;
var actDate;

var tlk = new Array();
var av = 0;
var d = new Object();

result2.h.documents.forEach(function(c) {
    averageScore += c.score;
  if(typeof(c.publicationDate) != "undefined"){
    docDate = c.publicationDate.split("-");
    actDate = new Date(docDate[0], docDate[1]-1, docDate[2].split(" ")[0]);
    if(actDate  endDate){
        endDate = actDate;
    }
    if(defined(tlk[actDate])){
        av = tlk[actDate];
        resultTmp[av].docs.push(c);
    }
    else {
        d = new Object();
        d.date = actDate;
        d.docs = new Array();
        d.docs.push(c);
        resultTmp[i] = d;
        tlk[actDate] = i;
        i++;
    }
  }
});

i = 0;
var dates = [];
for(key in tlk){
    if(key )
        d = new Date(key);
    if(isValidDate(d)){
    dates[i] = new Date(key);
    i++;        
    }
}
dates.sort(function (a, b) {
    return a > b;
});

var ii = 0;
i = 0;
var ddocs;
var result = new Array();
for(i=0; i maxDocsPerDate){
            maxDocsPerDate = d.docs.length;
        } 
        result[i] = d;
}


EDIT3 le code ci-dessus fonctionne maintenant:

En bref: J'utilise le tableau de TLK pour refléter la date à l'index. Pour un index dans le tableau resultTmp je stocke la date et l'ensemble des objets liés à cette date. La prochaine partie du code que je utiliser pour trier les dates de la plus ancienne à la plus récente et la resultTemp sorte analogue. La version triée de resultTemp est le résultat Array.

I données présentes dans protovis à façon suivante:


vis.add(pv.Line)
    .data(result)
    .lineWidth(2)
    .left(function(a) x(a.date))
    .bottom(function(a) y(a.docs.length))
    .add(pv.Dot)
    .lineWidth(function(a) a.docs.length - (a.docs.length-1)/3)
    .radius(function(a) a.docs.length * (a.docs.length/1.2))
    .fillStyle(function(a) color(a.docs.length))
    .event("click", function(a) Popup.show(a.docs))
    .anchor("top").add(pv.Label)
    .text(function(a) a.docs.length)
    .textBaseline("bottom");

vis.render();

Les regards de résultat exemplaires comme: i.imgur.com / WODYA.png
Je ne mentionnaient pas le code pour l'impression des axes x et y, ainsi que pour mise à l'échelle de la date à la largeur du graphique. Vous trouverez des exemples sur la page d'exemples de protovis.

BTW: Je suis confus pourquoi dans la partie:

for(key in tlk){
    dates[i] = new Date(key);
    i++;
}

Comme la dernière touche que je reçois « contient »? Essayé de trouver réponse sur Internet, sans succès. Bears a expliqué dans son commentaire que la raison pour laquelle je reçois ce probelm est parce que je suis sur les propriétés itérer du tableau.

Était-ce utile?

La solution

tableaux JavaScript ne supportent que l'indexation par numéro. Lorsque vous écrivez

ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};

vous ajoutez des propriétés ad hoc me et you au tableau; vous êtes pas ajouter des éléments au tableau. (En utilisant également le Si vous voulez un tableau constructeur de new Array() est un peu bizarre., Utilisez le littéral [].)

On dirait que vous devez utiliser un objet JavaScript, pas un tableau, mais soyez conscients qu'ils prennent en charge que les indices de chaîne.

var ct = {};
ct['me'] = {name: 'Jakub'};
ct['you'] = {name: 'stack'};

for (var k in ct) {
    document.getElementById('tmp', appendChild(document.createTextNode(ct[k]));
}

Modifier Si vous voulez traiter l'axe horizontal comme le temps, vous ne vraiment pas besoin de faire beaucoup plus de travail. Il y a un bon exemple de base ; voir la source de la page pour voir le code. L'astuce est que, alors que les données sont vraiment un tableau (d'objets), les x-coord est indiqué explicitement comme une propriété plutôt que comme l'indice dans le tableau de données. Chaque élément du tableau ressemble à ceci:

>>> data[0]
    {x: /* some JavaScript date object */, y: /* some number */ }

Sources:


Edit 2:. Vous semblez toujours mélangé sur les tableaux par rapport à des objets

En ce qui concerne votre « BTW »: lorsque vous écrivez vous for(key in tlk) ... itérez les clés qui sont déjà dans le tableau. C'est le traitement du tableau comme un objet, et ce n'est pas ce que vous voulez! Vous voyez contains parce que vous êtes sur les propriétés d'itérer un tableau, et contains est une fonction attachée à chaque tableau (vous utilisez prototype, ou une autre bibliothèque similaire?).

Le problème fondamental, cependant, est que vous êtes indexation dans un tableau (tlk) en utilisant une date. C'est un grand non-non; même si tlk est un objet, parce que vous pouvez uniquement les objets d'index en utilisant chaînes . Je ne comprends pas ce que vous faites avec tlk, mais je ne pense pas que vous avez besoin du tout. Quelle est la forme de vos données d'entrée? Si vous pouvez me donner un petit exemple de l'entrée, je peux probablement vous montrer ce qu'il faut faire avec.

, vous devriez vraiment utiliser également littérales tableaux et d'objets plutôt que les constructeurs de Array et Object. Par exemple, l'utilisation var tlk = [] plutôt que var tlk = new Array(); et var d = {}; plutôt que var d = new Object();.

Autres conseils

JavaScript ne possède pas de tableaux associatifs, par elle-même. Les objets possèdent les propriétés, mais, ce qui est similaire. foreach () ne itérer sur les propriétés indexées. Une boucle de for...in vous aidera ici, même si en général vous éviter d'utiliser for...in sur les tableaux parce que il itère propriétés sur nommées aussi.

for (var c in ct) {
    if (ct.hasOwnProperty(c)) {
        // do something
    }
}

Voir aussi:

La méthode de Array.prototype.forEach traverse la matrice sur ses indices numériques.

Les tableaux ne sont pas « associative », si vous voulez avoir des propriétés nommées avec des valeurs que vous devez utiliser un objet simple, et utiliser l'instruction for-in d'énumérer les propriétés existantes:

var ct = {};
ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};

for (var prop in ct) {
  if (ct.hasOwnProperty(prop)) {
    alert(ct[prop]);
  }
}

La méthode hasOwnProperty est appelée parce que les propriétés de la traverse des états de for-in qui sont héritées, de cette façon, il va énumérer seulement les propriétés qui existent physiquement sur l'objet (propriétés propres).

Vous pouvez utiliser if (Object.prototype.hasOwnProperty.call(ct, prop)) au lieu de if (ct.hasOwnProperty(prop)) pour plus de sécurité, parce que si l'objet a une propriété nommée « hasOwnProperty », ne sera pas la méthode que vous voulez exécuter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top