2012-02-14 10 views
5

Tengo una matriz de objetos llamada objarray. Cada objeto tiene el siguiente aspecto:Dividir matriz de objetos en nuevas matrices según el año de la fecha del objeto

var object = { 
    age: "45" 
    coords: "-37.807997 144.705784" 
    date: Sun Jul 28 2002 00:00:00 GMT+1000 (EST) 
} 

(fecha es un objeto Date)

necesito para empujar cada objeto en una nueva matriz basada en la fecha. Quiero que el resultado final se parezca a esto:

var dateGroups = [[object, object, object],[object, object], [object, object, object]]; 

Cada matriz dentro dateGroups contiene objetos con la misma fecha.

¿Esto es posible con arreglos? Anteriormente me genera un nuevo objeto que contenía todos los objarray objetos agrupados por fecha (fechas generan a partir de los datos):

var alldates = { 
    "1991" : [object, object, object], 
    "1992" : [object, object], 
    //etc... 
} 

Lo anterior parece una solución raro en la práctica, sin embargo, sólo tengo que ser capaz de acceder a los objetos por año: es decir, dateGroups [0] = matriz de objetos desde el primer año

¿Cómo puedo obtener los datos en algo así como los dateGroups matriz? ¿Hay una mejor manera de almacenar este tipo de datos?

+0

es mejor elegir JSON para esto. –

+0

¿Qué tipo de estructura JSON sería adecuada para agrupar por fecha? – tamarasaurus

Respuesta

7

Considere utilizar la función Underscore.jsgroupBy, seguido de sortBy.

groupBy producirá una estructura como alldates, si usted lo llama así:

var alldates = _.groupBy(objarray, function(obj) { 
    return obj.date.getFullYear(); 
}); 

sortBy se puede utilizar simplemente ordenar por clave, como esto:

var dateGroups = _.sortBy(alldates, function(v, k) { return k; }); 

También se pueden combinar los dos como este:

var dateGroups = _.chain(objarray) 
        .groupBy(function(obj) { return obj.date.getFullYear(); }) 
        .sortBy(function(v, k) { return k; }) 
        .value(); 

D Dependiendo de su caso de uso, puedo ver razones para usar una matriz de matrices, o un mapa de objetos de matrices. Si buscas en el índice, definitivamente usa el más tarde.

+0

Esto funcionó fantásticamente. ¡Gracias! Definitivamente necesitaré usar los índices más adelante. – tamarasaurus

0

Una vez que tenga las fechas en una estructura que se parece a esto:

var alldates = { 
    "1991" : [object, object, object], 
    "1992" : [object, object], 
    //etc... 
} 

Usted sólo puede utilizar este código para convertirlos a la estructura que desea:

var dateGroups = []; 

for(var year in allDates){ 
    dateGroups[dateGroups.length] = allDates[year]; 
} 
0

una respuesta utilizando reducir .

var ans = objects.reduce(function(prev,curr) { 
    if (!prev[curr.date.getFullYear()]) prev[curr.date.getFullYear()] = []; 
    prev[curr.date.getFullYear()] = curr; 
    return prev; 
},[]).reduce(function(prev,curr) { 
    prev.push(curr); 
    return prev; 
},[]); 

la primera es reducir para agrupar los objetos por fechas, y el segundo es para la fabricación de la llave de la gama de 0 a ejecutar el número de diferentes años - en lugar de la clave es el año en sí.

Cuestiones relacionadas