Frage

Das ist mein Code-Schnipsel, in dem das Programm nicht die foreach-Schleife eintritt:

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

Wenn ich den Array-Indizes von Strings ändern ( "me", "Sie") auf ganze Zahlen, es funktioniert:

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

Können Sie mir helfen, die Lösung zu iterieren den Arrays mit allen Arten von Indizes zu implementieren? Mein Ziel ist es, die Werte für die bestimmten Zeitpunkt Objekte zu speichern.


Ich verwende die Daten für die Protovis Bibliothek und AFAIK muss es ein Array als Eingabe.

Die Datenstruktur I im Protovis Beispiel verwenden ist komplizierter als diese oben gezeigt.

In meinem Projekt, das ich über JavaBean senden, um den Satz von einigen Objekten. Derjenigediejenigedasjenige Objekt enthält unter anderem das Datum. Mein Ziel ist es, diese Objekte auf dem Graphen wie diese, präsentiert auf Protovis Website zu zeigen http:. // vis.stanford.edu / Protovis / ex / area.html

werde ich die horizontale Achse für die Zeit nutzen, und die vertikale Achse für die Anzahl der Objekte für eine bestimmte Zeit. Aus diesem Grund möchte ich das Array nach dem Datum sortiert haben, da AFAIK Protovis erlaubt nur Arrays als Dateneingang für ihre Diagramme im Standardmodus - Funktion Verkettungs.

edit: Vorerst änderte ich die Methode. Anstelle von Strings als Array-Schlüssel speichern ich folgendes: Hiermit ist mein ursprünglicher Code-Schnipsel:
edit2 : Ich habe einige Original-Eingabe hinzugefügt: var result2 = { "h": { 10 "Dokumente": [ 11 { 12 "biographicalCategories": [ 13], 14 „Körper“: „Griechenland konservative Regierung hat eine Untersuchung zu einem Abkommen von 1955 zwischen der C.I.A. und dem griechischen Militär für die Errichtung eines Guerilla-Netzwerk bestellt Kräfte des Warschauer Paktes im Falle eines Krieges zu kämpfen Invasion“, 15 "Deskriptoren": [ 16], 17 "generalOnlineDescriptors": [ 18], 19 "guid": 0, 20 „Schlagzeile“: „Griechenland zur Untersuchung Plan für Guerrilla War“, 21 "Standorte": [ 22 „Griechenland“ 23], 24 "Name": [ 25], 26 "onlineDescriptors": [ 27], 28 "onlineLocations": [ 29], 30 "onlineOrganizations": [ 31], 32 "onlinePeople": [ 33], 34 "onlineTitles": [ 35], 36 "Organisationen": [ 37], 38 "Menschen": [ 39], 40 "Publication": "1990.11.21 00: 00: 00.0 CET", 41 "source": "0402635.xml", 42 "taxonomicClassifiers": [ 43], 44 "Titel": [ 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 der Code oben arbeitet nun:

Auf den Punkt gebracht: Ich verwende das tlk Array das Datum auf den Index zu reflektieren. Zum einem Index im Array resultTmp speichere ich das Datum und die Menge von Objekten zu diesem Zeitpunkt zusammen. Der nächste Teil des Codes I Gebrauchs sortieren die Termine von den ältesten zu den neuesten und analog Art der resultTemp. Die sortierte Version von resultTemp ist im Ergebnis Array.

I vorliegenden Daten in Protovis in folgenden Weise:


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

Das beispielhafte Ergebnis wie folgt aussieht: i.imgur.com / WODYA.png
Ich habe beinhalten nicht den Code zum Drucken der x und y-Achse sowie für die ab dem Datum der grafischen Darstellung Breite Skalierung. Sie können Beispiele auf der Protovis Beispiele Seite.

BTW: Ich bin verwirrt, warum in dem Teil:

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

Als der letzte Schlüssel erhalte ich „enthält“? Versuchte Antwort auf Internet zu finden, ohne Erfolg. Bears erklärte in seinem Kommentar, dass der Grund, warum ich dieses Probelm bekommen, weil ich Iterieren über die Eigenschaften des Arrays bin.

War es hilfreich?

Lösung

JavaScript-Arrays unterstützen nur die Indizierung durch Nummer. Wenn Sie schreiben

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

Sie hinzufügen Ad-hoc-Eigenschaften me und you den Array; Sie sind nicht Hinzufügen von Elementen in das Array. (Auch die new Array() Konstruktor ist irgendwie komisch. Wenn Sie ein Array wollen, die [] wörtliche verwenden.)

Es klingt wie Sie ein JavaScript-Objekt verwenden sollen, keinen Array, aber bewusst sein, dass sie nur String-Indizes unterstützen.

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

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

Edit: Wenn Sie die horizontale Achse als Zeit behandeln möchten, können Sie nicht wirklich brauchen viel mehr Arbeit zu tun. Es gibt ein guten Grund Beispiel hier ; Anzeigen der Seite Quelle den Code zu sehen. Der Trick dabei ist, dass, während die Daten wirklich ein Array (von Objekten) ist die x-Koordinate wird ausdrücklich festgestellt, als Eigenschaft und nicht als der Index in der Datenanordnung. Jedes Element im Array sieht ungefähr wie folgt aus:

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

Quellen:


Bearbeiten. 2: Sie scheinen immer noch über Arrays im Vergleich zu Objekten gemischt

In Bezug auf Ihre „BTW“: wenn Sie schreiben Sie sind Iterieren über die Tasten for(key in tlk) ..., die bereits in der Anordnung sind. Das ist die Behandlung der Matrix als ein Objekt, und das ist nicht das, was Sie wollen! Sie contains sehen, weil Sie Iterieren über Eigenschaften eines Arrays sind, und contains ist eine Funktion zu jedem Array angebracht (werden Sie mit Prototypen oder eine andere ähnliche Bibliothek?).

Das grundlegende Problem ist jedoch, dass Sie die Indizierung in ein Array (tlk) unter Verwendung von Date. Das ist eine große no-no; selbst wenn tlk ein Objekt ist, weil Sie nur mit Indexobjekte können Strings . Ich wirklich nicht, was Sie mit tlk tun, aber ich glaube nicht, dass Sie es überhaupt brauchen. Was ist die Form der Eingabedaten? Wenn Sie mir ein kleines Beispiel für die Eingabe geben kann, kann ich wahrscheinlich zeigen Ihnen, was damit zu tun.

Außerdem sollten Sie wirklich Array und Objektliterale verwenden, anstatt die Array und Object Bauer. Verwenden Sie zum Beispiel var tlk = [] statt var tlk = new Array(); und var d = {}; statt var d = new Object();.

Andere Tipps

JavaScript muss nicht assoziativen Arrays, par se. Objekte haben Eigenschaften genannt, obwohl, was ähnlich ist. foreach () nur Iterierte über Eigenschaften indiziert. Eine for...in Schleife wird Ihnen dabei helfen, obwohl in der Regel würden Sie mit for...in auf Arrays vermeiden, weil es auch über benannte Eigenschaften iteriert.

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

Siehe auch:

Die Array.prototype.forEach Verfahren durchläuft den Array auf seinen numerischen Indizes.

Arrays sind nicht ‚assoziative‘, wenn Sie mit den Werten genannten Eigenschaften haben wollen Sie ein einfaches Objekt verwendet werden soll, und verwenden Sie die for-in Anweisung, um die vorhandenen Eigenschaften aufzuzählen:

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

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

Die hasOwnProperty Methode aufgerufen wird, weil die for-in Anweisung Querungs Eigenschaften, die vererbt werden, auf diese Weise wird es nur die Eigenschaften aufzählen, die physisch auf dem Objekt vorhanden ist (eigene Eigenschaften).

Sie können if (Object.prototype.hasOwnProperty.call(ct, prop)) anstelle von if (ct.hasOwnProperty(prop)) für zusätzliche Sicherheit, denn wenn das Objekt eine Eigenschaft namens „hasOwnProperty“ hat, wird die Methode, die Sie nicht wollen auszuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top