J'ai un tableau comme celui-ci:

array = [[3, 'name'],[4, 'lastname'],[2, 'name'],[4, 'lastname']]

J'ai besoin de additionner les valeurs si elles ont un deuxième élément égal:

array = [[5, 'name'],[8, 'lastname']]

J'ai essayé de trier le tableau par ordre alphabétique, je sais qu'il n'y aura pas plus d'un doublon, puis si l'élément est égal à la prochaine somme de leurs valeurs, sinon ne faites rien. Peut-être que la condition doit être stricte, c'est juste pour montrer ce que j'ai essayé ...

for(var n=0; n<finish.length; n++) {
    if(finish[n][1] === finish[n+1][1]) {
      finish[n][0] += finish[n+1][0];
    } else {
      finish[n][0] = finish[n][0];
    }
  }

La boucle renvoie cette erreur: Cannot read property '1' of undefined

3
merko 15 avril 2018 à 09:20

3 réponses

Meilleure réponse

Vous pouvez utiliser reduce pour résumer les données dans un objet. Utilisez Object.values pour convertir l'objet en tableau

let array = [[3, 'name'],[4, 'lastname'],[2, 'name'],[4, 'lastname']];

let result = Object.values(array.reduce((c, v) => {
  if (c[v[1]]) c[v[1]][0] += v[0];     //Add the first element if already exist
  else c[v[1]] = v;                    //Assign the value if does not exist
  return c;
}, {}));

console.log(result);
3
Eddie 15 avril 2018 à 06:26

Vous montez jusqu'à n

if(finish[n][1] === finish[n+1][1])

Donc, dans ce cas, une fois arrivé à n = 3, la partie n + 1 fait référence à un élément qui n'est pas défini, et donc à l'erreur.

Pour résoudre ce problème, vous devez aller jusqu'à (n

0
Dustin 15 avril 2018 à 06:32

Vous pouvez également utiliser Map pour obtenir la sortie souhaitée:

let array = [[3, 'name'],[4, 'lastname'],[2, 'name'],[4, 'lastname']];

let map = ((m, a) => (array.forEach(c => {
   let [num, str] = c;
   m.set(str, (m.get(str) || 0) + num);
}), m))(new Map(), array);

let result = [...map.entries()].map(([a, b]) => [b, a]);

console.log(result);
1
Mohammad Usman 15 avril 2018 à 07:46