I have this array with parents and their children:
const array = [ { 'title':'America', 'type': 1 }, { 'title':'Brasil', 'type': 0 }, { 'title':'Ecuador', 'type': 0 }, { 'title':'Bolivia', 'type': 0 }, { 'title':'Europe', 'type': 1 }, { 'title':'Spain', 'type': 0 }, { 'title':'Italy', 'type': 0 }, { 'title':'Germany', 'type': 0 } ]
The problem that I have is that I need to order the children of each father, the result should be:
array_order = [ { 'title':'America', 'type': 1 }, { 'title':'Bolivia', 'type': 0 }, { 'title':'Brasil', 'type': 0 }, { 'title':'Ecuador', 'type': 0 }, { 'title':'Europe', 'type': 1 }, { 'title':'Germany', 'type': 0 }, { 'title':'Italy', 'type': 0 }, { 'title':'Spain', 'type': 0 } ]
That is the only information I have, the father has type 1 and his children are next in the list types 0.
Any help please.
Thanks.
By the way, I have tried this but I’m stucked:
let expTempFull = []; let expTempFirst = []; expTemp.forEach((el)=>{ if (el.type == 1){ if (expTempFirst.length == 0){ expTempFull.push(el); }else{ expTempFirst = expTempFirst.sort((a, b) => a.title.localeCompare(b.title)); expTempFirst.forEach((ex)=>{ expTempFull.push(ex); }); expTempFirst = []; expTempFull.push(el); } } else { expTempFirst.push(el); if (el.title === expTemp[expTemp.length - 1].title){ expTempFull.push(el); } } });
Advertisement
Answer
You could treat any same type as own group, sort them and take a flat array as result.
const array = [{ title: 'America', type: 1 }, { title: 'Brasil', type: 0 }, { title: 'Ecuador', type: 0 }, { title: 'Bolivia', type: 0 }, { title: 'Europe', type: 1 }, { title: 'Spain', type: 0 }, { title: 'Italy', type: 0 }, { title: 'Germany', type: 0 }], result = array .reduce((r, o, i) => { if (!i || r[r.length - 1][0].type !== o.type) r.push([]); r[r.length - 1].push(o); return r; }, []) .flatMap(array => array.sort((a, b) => a.title.localeCompare(b.title))); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }