Pregunta

Este es mi fragmento de código, donde el programa no entra en el bucle foreach:

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

Cuando cambio los índices de matriz de cadenas ( "Me", "usted") en enteros, funciona:

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

¿Puede usted ayudarme a implementar la solución para repetir las matrices con todo tipo de índices? Mi objetivo es almacenar los valores de los objetos de fecha dada.


I utilizar los datos para el href="http://vis.stanford.edu/protovis/" rel="nofollow noreferrer"> Protovis biblioteca y AFAIK que necesita una matriz como entrada.

La estructura de datos que utilizo en el ejemplo Protovis es más complicado que éste se muestra arriba.

En mi proyecto yo envío a través de JavaBean el conjunto de algunos objetos. Aquellos objeto contiene entre otras cosas la fecha. Mi objetivo es mostrar los objetos en el gráfico de esta manera, se presenta en la página web http Protovis:. // vis.stanford.edu / Protovis / ex / area.html

I utilizará el eje horizontal para el tiempo, y el eje vertical para el número de objetos durante un tiempo dado. Esto es por lo que quieren tener la matriz ordenada por la fecha, ya que yo sepa Protovis sólo permite matrices como entrada de datos para sus diagramas en el modo por defecto - la función de encadenamiento.

editar: Por ahora he cambiado el método. En lugar de almacenar cadenas como claves de matriz Yo siguientes: Por la presente es mi fragmento de código original:
Edit2 : He añadido algunos de entrada original: var result2 = { "h": { 10 "documentos": [ 11 { 12 "biographicalCategories": [ 13], 14 "cuerpo": "El Gobierno conservador de Grecia ha ordenado una investigación sobre un acuerdo de 1955 entre el C.I.A. y el ejército griego para el establecimiento de una red de guerrillas para luchar contra la invasión de las fuerzas del Pacto de Varsovia en el caso de una guerra", 15 "descriptores": [ dieciséis ], 17 "generalOnlineDescriptors": [ 18], 19 "GUID": 0, 20 "titular": "Grecia para Investigar Plan para la guerra de guerrillas", 21 "sitios": [ 22 "GRECIA" 23], 24 "nombres": [ 25], 26 "onlineDescriptors": [ 27], 28 "onlineLocations": [ 29], 30 "onlineOrganizations": [ 31], 32 "onlinePeople": [ 33], 34 "onlineTitles": [ 35], 36 "organizaciones": [ 37], 38 "personas": [ 39], 40 "PublicationDate": "11/21/1990 00: 00: 00.0 CET", 41 "sourceFile": "0402635.xml", 42 "taxonomicClassifiers": [ 43], 44 "títulos": [ 45], 46 "typesOfMaterial": [ 47], 48 "puntuación": 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 el código anterior está trabajando ahora:

En pocas palabras: Yo uso la matriz tlk para reflejar la fecha para el índice. Por un índice de la matriz resultTmp almaceno la fecha y el conjunto de objetos relacionados con esa fecha. La siguiente parte del código que uso para ordenar las fechas de la más antigua a la más nueva y de forma análoga al tipo resultTemp. La versión clasificada de resultTemp está en el arreglo de resultados.

I de datos presentes en Protovis en forma siguiente:


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

Las miradas resultado ejemplares como: i.imgur.com / WODYA.png
No incluir el código para la impresión de los ejes X e Y, así como para la ampliación de la fecha a la anchura gráfico. Puede encontrar ejemplos en la página Protovis ejemplos.

Por cierto: Estoy confundido por qué en la parte:

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

A medida que la última llave consigo "contiene"? Tratado de encontrar respuesta en Internet, sin éxito. Osos explican en su comentario de que la razón por la que sale este probelm es porque estoy interactuando sobre las propiedades de la matriz.

¿Fue útil?

Solución

matrices de JavaScript sólo admiten la indexación por número. Cuando se escribe

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

va a agregar ad-hoc propiedades me y you a la matriz; usted es no añadir elementos a la matriz. (También con el constructor new Array() es un poco raro. Si desea una matriz, utilice el literal [].)

Parece que usted debe usar un objeto de JavaScript, no una matriz, pero tengan presente que no sólo son compatibles con los índices de cuerda.

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

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

Editar Si desea tratar el eje horizontal como el tiempo, que realmente no necesita hacer mucho más trabajo. Hay un buen ejemplo básico aquí ; ver la fuente de la página para ver el código. El truco aquí es que, mientras que los datos realmente es una matriz (de objetos), la coordenada x se afirma explícitamente como una propiedad más que como el índice de la matriz de datos. Cada elemento de la matriz es como la siguiente:

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

Fuentes:


Editar. 2: Todavía parece confundido acerca de las matrices frente a objetos

En cuanto a su "BTW": cuando se escribe que for(key in tlk) ... No Eres iterar sobre las claves que ya se encuentran en la matriz. Eso es el tratamiento de la matriz como un objeto, y eso no es lo que quieres! Ves contains porque estás interactuando sobre las propiedades de una matriz, y contains es una función adjunta a cada array (está usando prototipo, u otra biblioteca similar?).

El problema de fondo, sin embargo, es que usted está indexado en una matriz (tlk) usando una fecha. Eso es un gran no-no; incluso si tlk es un objeto, porque se puede utilizar sólo los objetos de índice cadenas . Realmente no entiendo lo que está haciendo con tlk, pero no creo que lo necesite en absoluto. ¿Cuál es la forma de sus datos de entrada? Si usted me puede dar un pequeño ejemplo de la entrada, es probable que pueda mostrar lo que tiene que hacer con él.

Además, se debe utilizar realmente literales de matriz y el objeto en lugar de los constructores y Array Object. Por ejemplo, el uso var tlk = [] en lugar de var tlk = new Array();, y var d = {}; en lugar de var d = new Object();.

Otros consejos

JavaScript no tiene matrices asociativas, par se. Los objetos han llamado propiedades, sin embargo, que es similar. forEach () sólo se iterar sobre indexados propiedades. Un bucle for...in le ayudará aquí, aunque, en general, que le evite el uso de for...in en arrays ya itera sobre las propiedades nombradas también.

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

Ver también:

El método Array.prototype.forEach atraviesa la matriz en sus índices numéricos.

Las matrices no son 'asociativo', si usted quiere tener propiedades denominadas con los valores que debe utilizar un objeto simple, y utilizar la instrucción for-in para enumerar las propiedades existentes:

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

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

El método se llama hasOwnProperty porque las propiedades transversales declaración for-in que se heredan, de esa manera se van a enumerar sólo las propiedades que existen físicamente en el objeto (propiedades propias).

Se puede utilizar en lugar de if (Object.prototype.hasOwnProperty.call(ct, prop)) if (ct.hasOwnProperty(prop)) para mayor seguridad, ya que si el objeto tiene una propiedad denominada "hasOwnProperty", no será el método que desea ejecutar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top