Sarò breve. Sto imparando un pò di javascript qui
http://eloquentjavascript.net. Chiedo aiuto per la comprensione di una soluzione ad un esercizio. La soluzione la si può trovare qui
http://eloquentjavascript.net/code/#5. (cliccando sull'apposito bottone in fondo per mostrare la soluzione). Vi dico solo che ancestry è un array di oggetti che rappresentano persone, in quanto qui potete visionare il testo dell'esercizio
http://eloquentjavascript.net/05_higher_order.htm (è il 3). Ripropongo il codice della soluzione dell'esercizio:
function average(array) {
function plus(a, b) { return a + b; }
return array.reduce(plus) / array.length;
}
function groupBy(array, groupOf) {
var groups = {};
array.forEach(function(element) {
var groupName = groupOf(element);
if (groupName in groups)
groups[groupName].push(element);
else
groups[groupName] = [element]; //??????????? riga 13
});
return groups;
}
var byCentury = groupBy(ancestry, function(person) {
return Math.ceil(person.died / 100);
});
for (var century in byCentury) {
var ages = byCentury[century].map(function(person) {
return person.died - person.born;
});
console.log(century + ": " + average(ages));
}
La riga di codice non chiara l'ho evidenziata con una serie di punti di domanda. Praticamente se un determinato secolo è presente in groups, aggiungo la persona a quel secolo con il metodo push mentre se il secolo non è presente in teoria dovrei aggiungerlo e poi aggiungere la persona a quel particolare secolo, cosa che dovrebbe fare la riga che non ho capito. Perchè c'è l'oggetto element tra parentesi quadre? Ho provato a stampare l'oggetto groups subito dopo la famosa riga evidenziata(in else tra parentesi graffe) per vedere come evolveva groups . La cosa strana è che al primo ciclo, dopo la riga 13 , groups non contiene solo un elemento come mi sarei aspettato , ma contiene tutti gli elementi . Forse ho sbagliato qualcosa. Ecco il codice con la modifica fatta :
function groupBy(array, groupOf) {
var groups = {};
array.forEach(function(element) {
var groupName = groupOf(element);
if (groupName in groups)
groups[groupName].push(element);
else{
groups[groupName] = [element];
console.log(groups);}
});
return groups;
}