J'essaie d'itérer un tableau d'objets avec des valeurs clés similaires et je veux calculer combien de fois leurs valeurs ont été répétées dans tout le tableau d'objets, par exemple nombre de «dîner» dans un ensemble d'objets

var objects = [
  { Ram: 'Lunch',  Luv:'Lunch',  Rani:'Dinner' },
  { Ram: 'Dinner', Luv:'Lunch',  Rani:'Dinner' },
  { Ram: 'Lunch',  Luv:'Dinner', Rani:'Dinner' }
];

J'essaie de calculer combien de fois le déjeuner est arrivé et combien de fois le dîner est arrivé et je veux afficher ci-dessous json comme ceci -

[{'Dinner':5}, {'Lunch':4}];

Comment puis-je y parvenir en javascript?

-2
Aanchal 12 avril 2018 à 12:15

3 réponses

Meilleure réponse

Vous pouvez utiliser reduce() avec Object.values() et renvoyer un objet en conséquence au lieu d'un tableau d'objets.

var objects=[
{Ram:'Lunch', Luv:'Lunch', Rani:'Dinner'},
{Ram:'Dinner', Luv:'Lunch', Rani:'Dinner'},
{Ram:'Lunch', Luv:'Dinner', Rani:'Dinner'}
]

const result = objects.reduce((r, o) => {
  Object.values(o).forEach(e => r[e] = (r[e] || 0) + 1)
  return r;
}, {});

console.log(result)
2
Nenad Vracar 12 avril 2018 à 09:21

Parce que je n'aime pas forEach, voici une double réduction :

const objects = [
  { Ram: 'Lunch',  Luv: 'Lunch',  Rani: 'Dinner' },
  { Ram: 'Dinner', Luv: 'Lunch',  Rani: 'Dinner' },
  { Ram: 'Lunch',  Luv: 'Dinner', Rani: 'Dinner' }
];

const count = objects
  // collect and flatten object values
  .reduce((a, o) => a.concat(Object.values(o)), [])

  // count individual
  .reduce((c, v) => ({...c, [v]: (c[v] || 0) + 1}), {})
;

const list = Object.entries(count)
  // map to {type, count}
  .map(([type, count]) => ({type, count}))
;

console.log(count, list);
1
Yoshi 17 avril 2018 à 08:13

Utilisez reduce avec forEach

var output = objects.reduce( (a, c) => 
    (Object.values(c).forEach( 
       s => a[s] = (a[s] || 0) + 1 ), //end forEach
    a), 
{})//end reduce

Démo

var objects = [{
    Ram: "Lunch",
    Luv: "Lunch",
    Rani: "Dinner"
  },
  {
    Ram: "Dinner",
    Luv: "Lunch",
    Rani: "Dinner"
  },
  {
    Ram: "Lunch",
    Luv: "Dinner",
    Rani: "Dinner"
  }
];
var output = objects.reduce((a, c) => (Object.values(c).forEach(s => a[s] = (a[s] || 0) + 1), a), {});
console.log(output);
0
gurvinder372 12 avril 2018 à 09:21