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" }, ]
4 Réponses :
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)
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 );
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')));
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);