Фильтрация с преобразованием объекта в массив
Как преобразовать с помощью JS Объект со вложенными массивами
{
"0" : {
"breakpoint" : 13000,
"groups" : {
"0" : [ 1 ],
"1" : [ 0 ],
"2" : [ 0 ]
}
},
"1" : {
"breakpoint" : 41000,
"groups" : {
"0" : [ 0 ],
"1" : [ 1 ],
"2" : [ 0 ]
}
},
"2" : {
"breakpoint" : 27000,
"groups" : {
"0" : [ 1 ],
"1" : [ 0 ],
"2" : [ 1 ]
}
}
}
в Массив такого вида:
[
{
"groups" : 0,
"breakpoint" : [
13000,
27000
]
}
{
"groups" : 1,
"breakpoint" : [
41000
]
}
{
"groups" : 2,
"breakpoint" : [
27000
]
}
]
Ответы (2 шт):
Автор решения: Евгений Платов
→ Ссылка
const data={
"0" : {
"breakpoint" : 13000,
"groups" : {
"0" : [ 1 ],
"1" : [ 0 ],
"2" : [ 0 ]
}
},
"1" : {
"breakpoint" : 41000,
"groups" : {
"0" : [ 0 ],
"1" : [ 1 ],
"2" : [ 0 ]
}
},
"2" : {
"breakpoint" : 27000,
"groups" : {
"0" : [ 1 ],
"1" : [ 0 ],
"2" : [ 1 ]
}
}
};
const result = Object.entries(data).reduce((acc,item)=>{
Object.entries(item[1].groups).map(g=>{
if(!acc[g[0]]) acc[g[0]] = {"groups" : parseInt(g[0]),breakpoint:[]};
if(g[1][0]===1) acc[g[0]].breakpoint.push(item[1].breakpoint);
})
return acc;
},[]);
console.log(result);
Автор решения: vsemozhebuty
→ Ссылка
Если имена групп всегда являются последовательными числами от 0 и выше, можно так:
const breakpoints = {
"0" : {
"breakpoint" : 13000,
"groups" : {
"0" : [ 1 ],
"1" : [ 0 ],
"2" : [ 0 ]
}
},
"1" : {
"breakpoint" : 41000,
"groups" : {
"0" : [ 0 ],
"1" : [ 1 ],
"2" : [ 0 ]
}
},
"2" : {
"breakpoint" : 27000,
"groups" : {
"0" : [ 1 ],
"1" : [ 0 ],
"2" : [ 1 ]
}
}
};
const groups = Object.values(breakpoints).reduce(
(acc, { breakpoint, groups }) => {
for (const [group, [hasBreakpoint]] of Object.entries(groups)) {
if (!acc[group]) acc[group] = { groups: group, breakpoint: [] };
if (hasBreakpoint) acc[group].breakpoint.push(breakpoint);
}
return acc;
},
[],
);
console.log(groups);