0
votes

Comment grouper par tableau d'ID

Bonjour les gars, pouvez-vous m'aider à réduire les tableaux s'il vous plaît. J'ai deux tableaux et j'ai besoin de grouper l'un d'entre eux au milieu. Ici vous pouvez trouver un exemple

J'ai un tableau d'objets

const arr = [{
    mid: 888,
    projects: [{
        name: "test"
      },
      {
        name: "test1"
      },
      {
        name: "test2"
      },
    ]
  },
  {
    mid: 777,
    projects: [{
      name: "test10"
    }, ]
  }
]

Mais j'ai besoin d'un groupe par mi et obtenir quelque chose comme ça

const arr = [{
    mid: 888,
    name: "test"
  },
  {
    mid: 888,
    name: "test1"
  },
  {
    mid: 888,
    name: "test2"
  },
  {
    mid: 777,
    name: "test10"
  },
]


0 commentaires

4 Réponses :


1
votes

const arr = [{
    mid: 888,
    name: "test"
  },
  {
    mid: 888,
    name: "test1"
  },
  {
    mid: 888,
    name: "test2"
  },
  {
    mid: 777,
    name: "test10"
  }
];

newArray = arr.map(item => item.mid).filter((value, index, self)=> { 
    return self.indexOf(value) === index;
}).map(item=> { return {mid: item, projects: []}})

newArray = arr.reduce((res, current)=>{
    let index = newArray.map(item => item.mid).indexOf(current.mid);
    res[index].projects.push({name: current.name})
    
    return res;
}, newArray)

console.log(newArray)

autrement avec reduce:

const arr = [{
    mid: 888,
    name: "test"
  },
  {
    mid: 888,
    name: "test1"
  },
  {
    mid: 888,
    name: "test2"
  },
  {
    mid: 777,
    name: "test10"
  }
];

let newArray = []
arr.map(item => item.mid).filter((value, index, self)=> { 
    return self.indexOf(value) === index;
}).forEach((mid)=>{
    newArray.push({
        mid,
        projects: arr.filter(item => item.mid == mid).map(item =>{ return {name: item.name}; })
    })
})

console.log(newArray)


0 commentaires

0
votes

Ce ne serait pas le moyen le plus rapide, mais cela pourrait aider à mieux comprendre la fonction de réduction, en expérimentant avec un extrait de code) * JsFiddle

let arr = [{
    mid: 888,
    name: 'test'
  },
  {
    mid: 888,
    name: 'test1'
  },
  {
    mid: 888,
    name: 'test2'
  },
  {
    mid: 777,
    name: 'test10'
  },
]

let reduced = arr.reduce((prev, now) => {
  // first iteration, prev == []
  // now == { mid: 888, name: 'test' }
  let index = prev.map(e => e.mid).indexOf(now.mid);
  if (~index) { // if index found
    prev[index].projects.push({
      name: now.name
    })
  } else {
    prev.push({
      mid: now.mid,
      projects: [{
        name: now.name
      }]
    })
  }
  return prev;
}, []); /* Starting from empty array */

console.log( reduced );


0 commentaires

0
votes

Vous pouvez le regrouper comme ceci.

{888: [{
    name: test
  },
  {
    name: test1
  },
  {
    name: test2
  },
],
777: [{
  name: test10
} ]}

et le résultat sera

var groupedData = _.mapValues(_.groupBy(arr, 'mid'),
                      clist => clist.map(car => _.omit(car, 'mid')));


0 commentaires

0
votes

Voici comment une simple fonction reduction peut faire l'affaire en utilisant filter et cas ternaire:

const arr = [{mid: 888,name: "test"},
  {mid: 888,name: "test1"},
  {mid: 888, name: "test2"},
  {mid: 777, name: "test10"}];

let newArray = arr.reduce(function (r, row) {
    let dt = r.filter(x => x.mid == row.mid);
    dt.length ? dt[0].projects.push(row.name): r.push({mid: row.mid, projects: [row.name]});
    return r;
}, []);

console.log(newArray);


0 commentaires