2012-07-25 40 views
7

Im tratando de construir un gráfico de plugin jQuery "Flot" algo avanzado. Para eso, necesito un objeto multidimensional (o al menos creo que lo es).Crear objeto multidimensional con matrices multidimensionales

La estructura debe tener este aspecto:

var datasets = { 
     "usa": { 
      label: "USA", 
      data: [[1988, 483994], [1989, 479060], [1990, 457648], [1991, 401949], [1992, 424705], [1993, 402375], [1994, 377867], [1995, 357382], [1996, 337946], [1997, 336185], [1998, 328611], [1999, 329421], [2000, 342172], [2001, 344932], [2002, 387303], [2003, 440813], [2004, 480451], [2005, 504638], [2006, 528692]] 
     },   
     "russia": { 
      label: "Russia", 
      data: [[1988, 218000], [1989, 203000], [1990, 171000], [1992, 42500], [1993, 37600], [1994, 36600], [1995, 21700], [1996, 19200], [1997, 21300], [1998, 13600], [1999, 14000], [2000, 19100], [2001, 21300], [2002, 23600], [2003, 25100], [2004, 26100], [2005, 31100], [2006, 34700]] 
     } 
}; 

Desde mi código subyacente he generado algunas listas con este aspecto (no los mismos datos, pero no me importa eso):

<ul id="MOBILISATION"> 
    <li data-key="2012/3/27">02:10</li> 
    <li data-key="2012/3/28">05:25</li> 
    <li data-key="2012/3/29">09:21</li> 
    <li data-key="2012/3/30">00:00</li> 
    <li data-key="2012/3/31">00:00</li> 
</ul> 
<ul id="OPERATIONS"> 
    <li data-key="2012/3/27">19:51</li> 
    <li data-key="2012/3/28">18:35</li> 
    <li data-key="2012/3/29">14:39</li> 
    <li data-key="2012/3/30">07:46</li> 
    <li data-key="2012/3/31">10:26</li> 
</ul> 

Donde "USA/usa" es "MOVILIZACIÓN", "1988" es "2012/3/27" y "483994" es "02:10". ¿Te haces una foto?

He intentado escribir alguna jQuery, pero, obviamente, el trabajo doesnt:

var objects = []; 
    var array = []; 
    var categoryName = ""; 
    $('div#Container ul').each(function() { 
     catName = $(this).attr('id'); 
     $('li', this).each(function() { 
      array.push([new Date($(this).data('key')).getTime(), $(this).text()]); 
     }); 

     objects.push({ categoryName: { label: categoryName, data: array} }); 
    }); 
    var datasets = objects; 

Como se puede ver que he utilizado empuje para objects matriz. Claramente, eso no me está dando el resultado que quiero. Estoy amablemente perdiendo lo que tengo arriba y abajo en esto, ya que es la primera vez que trabajo con objetos javascript/jQuery. ¿Cuál es la mejor solución para esto?

+0

Podría ser más fácil si usted nos dio la lista de bienes :-) – Bergi

+0

Jaja Yo sé compañero, im solo a perezoso para escribirlo. Acabo de encontrar un ejemplo al azar :) –

Respuesta

6

Sus conjuntos de datos es un objeto, no una matriz, no se puede presionar. Además, su variable categoryName no funciona así (lea más en dot and bracket notation). Prueba esto:

var datasets = {}; 
$('div#Container ul').each(function() { 
    catName = this.id; 
    var array = []; 
    $('li', this).each(function() { 
     array.push([ 
      new Date($(this).data('key')).getTime(), 
      $(this).text() 
     ]); 
    }); 
    datasets[catName.toLowercase()] = { 
     label: catName.toUppercase(), 
     data: array 
    }; 
}); 

Además, no estoy seguro de si realmente se necesita para crear objetos Date, pero eso depende de su formato de entradas y salida.

+0

Necesito el objeto de fecha porque tengo el modo de propiedad de mi eje x en "tiempo" (para que el plugin de Flot funcione). Con su código salido de la caja, el contenedor gráfico y las categorías se dibujan muy bien. Mi próximo problema es el objeto Date. No hay datos/barras/líneas en el gráfico, porque el complemento no puede reconocer la cadena "hh: mm" en el eje y como el tiempo. Dame un segundo para resolverlo y marcar mal tu respuesta como correcta (aunque todas las otras respuestas son correctas también solo leyéndolas). Gracias –

+0

como se puede ver http://www18.speedyshare.com/zmgqp/download/graph.jpg :) –

+0

Mmm, sí, no puedo hacer que funcione. ¿Tienes alguna idea de qué hacer? Intenté convertirlo en un objeto Date y establecí la propiedad de formato de fecha para los complementos y-axis. Sin suerte –

10

Cambio var objects = []; a var objects = {}; y cambiar

objects.push({ categoryName: { label: categoryName, data: array} }); 

a

objects[categoryName] = { label: categoryName, data: array}; 

El problema que tiene con objetos JSON está en la configuración de propiedades con un índice variable. Puede usar la notación de matriz para hacer eso, como se indicó anteriormente.

1

Trate

var data = {}; 
    $('div#Container ul').each(function() { 
     var sub_obj = data[$(this).attr('id').toLowerCase()] = { 
      label: $(this).attr('id').toUpperCase(), 
      data: [] 
     }; 
     $(this).children('li').each(function() { 
      sub_obj.data.push([$(this).data('key'), $(this).text()]); 
     }); 
    }); 
    console.log(data); 
1

Prueba esto:

var datasets = {}; 

$('ul').each(function (i, v) { 
    catName = $(this).attr('id'); 
    datasets[catName] = { 
     label : catName, 
     data: []    
    };   
    $('li', this).each(function() { 
     datasets[catName].data.push([new Date($(this).data('key')).getTime(), $(this).text()]); 
    }) 
}); 

Demostración: http://jsfiddle.net/nfsYu/6/

+0

¿Por qué no utilizar un objeto literal? – Bergi

+0

Aún no es mejor, quise decir todo el objeto no solo el nuevo Objeto() ... – Bergi

+0

@Bergi okay .... – undefined

Cuestiones relacionadas