Je veux fusionner dynamiquement un seul tableau de plusieurs objets avec la même clé. Voici un exemple de données:

var data = [{
  ReportTime: "30 Apr 2017BDT",
  Rate: "1.00000",
  AvgGrowth: "0.0"
}, {
  ReportTime: "30 Apr 2017BDT",
  Rate: "0.01107",
  AvgGrowth: "0.1"
}, {
  ReportTime: "29 Apr 2017BDT",
  Rate: "1.00000",
  AvgGrowth: "0.0"
}, {
  ReportTime: "29 Apr 2017BDT",
  Rate: "0.01107",
  AvgGrowth: "-0.5"
}]

Je veux générer des données comme celle-ci

newData = [{
  "30 Apr 2017BDT",
  "1.00000",
  "0.0",
  "0.01107",
  "0.1"
}, {
  "29 Apr 2017BDT",
  "1.00000",
  "0.0",
  "0.01107",
  "-0.5"
}];

J'ai besoin d'une suggestion ou d'une aide, comment résoudre ce problème.

0
Parth Raval 8 avril 2020 à 12:15

3 réponses

Vous pouvez utiliser la réduction pour regrouper les valeurs de ReportTime

const data = [{ ReportTime: "30 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"}, { ReportTime: "30 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "0.1"}, { ReportTime: "29 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"
}, { ReportTime: "29 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "-0.5"}]

const merged = data.reduce((op, inp) => {
  let key = inp.ReportTime
  op[key] = op[key] || []
  op[key].push(inp)
  return op
}, Object.create(null))

console.log(merged)
0
Code Maniac 8 avril 2020 à 09:25

Je pense que si faire du groupe ReportTime en objet avec le maintien de Rate et AvgGrowth sera utile.

Passez en revue les éléments, créez un objet avec des clés comme "ReportTime". Lorsque ReportTime existe déjà dans l'objet, mettez à jour simplement Rate et AvgGrowth. Après l'itération, obtenez Object.values () de l'objet ci-dessus pour l'obtenir en tant que tableau.

const update = data => {
  const res = {};
  data.forEach(item => {
    if (!res[item.ReportTime]) {
      res[item.ReportTime] = {
        ReportTime: item.ReportTime,
        Rate: [],
        AvgGrowth: []
      };
    }
    res[item.ReportTime].Rate.push(item.Rate);
    res[item.ReportTime].AvgGrowth.push(item.AvgGrowth);
  });
  return Object.values(res);
};

var data = [
  {
    ReportTime: "30 Apr 2017BDT",
    Rate: "1.00000",
    AvgGrowth: "0.0"
  },
  {
    ReportTime: "30 Apr 2017BDT",
    Rate: "0.01107",
    AvgGrowth: "0.1"
  },
  {
    ReportTime: "29 Apr 2017BDT",
    Rate: "1.00000",
    AvgGrowth: "0.0"
  },
  {
    ReportTime: "29 Apr 2017BDT",
    Rate: "0.01107",
    AvgGrowth: "-0.5"
  }
];

console.log(update(data));
0
Siva Ko 8 avril 2020 à 09:29

Votre sortie attendue ne ressemble pas à un JS valide. Vous pouvez cependant obtenir un tableau de tableaux en itérant sur le tableau en utilisant quelques méthodes comme .reduce(), .map() et Object.entries():

const data = [
  {ReportTime: "30 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"},
  {ReportTime: "30 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "0.1"},
  {ReportTime: "29 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"},
  {ReportTime: "29 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "-0.5"}
];

const result = Object.entries(
  data.reduce((r, {ReportTime, ...rest}) => {
    r[ReportTime] = (r[ReportTime] || []).concat(Object.values(rest));
    return r;
  }, {})
).map(([k, v]) => [k, ...v]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0
Mohammad Usman 8 avril 2020 à 09:26