J'ai un tableau d'objets. Je dois fusionner des éléments du tableau si la propriété tag est la même, puis additionner les propriétés counter de ces objets.

Voici mon exemple de tableau :

[
    {
        "tag": "#sala",
        "state": {
            "counter": 1
        }
    },
    {
        "tag": "#sala",
        "state": {
            "counter": 2
        }
    }
]

Voici à quoi devrait ressembler le tableau après la fusion :

[
    {
        "tag": "#sala",
        "state": {
            "counter": 3
        }
    }
]
-6
Daniel Pereira 18 mars 2019 à 19:40

2 réponses

Meilleure réponse

Vous pouvez utiliser la fonction de réduction de tableau et, à l'intérieur du rappel de réduction, utiliser findIndex pour vérifier si le tableau d'accumulateurs a un objet avec la même balise. Si un objet avec la même balise est trouvé, mettez à jour le compteur dans cet objet, sinon poussez l'objet actuel dans le tableau d'accumulateurs

let data = [{
    "tag": "#sala",
    "state": {
      "counter": 1
    }
  },
  {
    "tag": "#sala",
    "state": {
      "counter": 2
    }
  }
];
let newData = data.reduce(function(acc, curr) {
  let findTagIndex = acc.findIndex(item => item.tag === curr.tag);
  if (findTagIndex === -1) {
    acc.push(curr)
  } else {
    acc[findTagIndex].state.counter += curr.state.counter
  }
  return acc;
}, []);
console.log(newData)
2
brk 18 mars 2019 à 16:46

Vous pouvez utiliser Array#reduce pour créer des balises de mappage d'objets vers des compteurs, puis utiliser Object.entries avec Array #map pour reconvertir l'objet dans votre structure de tableau d'origine"

let data = [{
    "tag": "#sala",
    "state": {
      "counter": 1
    }
  },
  {
    "tag": "#sala",
    "state": {
      "counter": 2
    }
  }
];

let newData = data.reduce(
  ( obj, { tag, state: { counter } } ) => ( obj[ tag ] = counter + (obj[ tag ] || 0), obj ), { }
);

// Object mapping tags to counter sums
console.log( newData );

// If you need your original array structure:
newData = Object.entries( newData ).map( ( [ key,value ]) => ( { tag: key, state: { counter: value } } ) );

console.log( newData );
1
Paul 18 mars 2019 à 18:09