2012-02-14 8 views
5

Ho una matrice di oggetti denominata objarray. Ogni oggetto è simile al seguente:Divisione dell'array di oggetti in nuovi array in base all'anno di data dell'oggetto

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

(data è un oggetto Date)

ho bisogno di spingere ogni oggetto in un nuovo array in base alla data. Voglio che il risultato finale a guardare come questo:

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

Ogni matrice all'interno dateGroups contiene oggetti con la stessa data.

E 'possibile farlo con gli array? In precedenza ho generato un nuovo oggetto che conteneva tutti i objArray oggetti raggruppati per data (le date generati dai dati):

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

È possibile che questo sembra una soluzione strana, in pratica, però, ho solo bisogno di essere in grado di accedere agli oggetti per anno: cioè dateGroups [0] = array di oggetti dal primo anno

Come dovrei ottenere i dati in qualcosa di simile alle dateGroups matrice? C'è un modo migliore per archiviare questo tipo di dati?

+0

meglio scegliere JSON per questo. –

+0

Che tipo di struttura JSON sarebbe adatta per raggruppare per data? – tamarasaurus

risposta

7

Considerare l'utilizzo della funzione groupBy, seguita da sortBy.

groupBy produrrà una struttura come alldates, se lo si chiama in questo modo:

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

sortBy può essere utilizzato semplicemente ordina per chiave, in questo modo:

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

È possibile anche combinare i due in questo modo:

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

D In base al tuo caso d'uso, posso vedere i motivi per l'utilizzo di un array di matrici o di una mappa di oggetti di array. Se stai cercando indice, usa sicuramente il dopo.

+0

Questo ha funzionato in modo fantastico. Grazie! Avrò sicuramente bisogno di usare gli indici più tardi. – tamarasaurus

0

Una volta che avete le date in una struttura che assomiglia a questo:

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

Si può semplicemente utilizzare questo codice per convertirli alla struttura che si desidera:

var dateGroups = []; 

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

Una risposta utilizzando ridurre .

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; 
},[]); 

il primo ridurre è per raggruppare gli oggetti da date, e il secondo è per rendere la chiave dell'array eseguito da 0 al numero di anni diversi - invece del tasto è l'anno stesso.