I am new to javascript. I need to arrange the data, in some particular format.
[{id:1,isNew:"no"},
{id:2,isNew:"no"},
{id:3,isNew:"yes"},
{id:4,isNew:"no"},
{id:5,isNew:"no"},
{id:6,isNew:"no"},
{id:7,isNew:"yes"},
{id:8,isNew:"no"},
{id:9,isNew:"no"},
{id:10,isNew:"yes"}]
I need to manipulate data as this -
[{
id:1,
isNew:"no"
},
{
id:2,
isNew:"no"
},
{
id:3,
isNew:"yes",
"sub":[
{id:4,isNew:"no"},
{id:5,isNew:"no"},
{id:6,isNew:"no"}
]
},
{
id:7,
isNew:"yes",
"sub":[
{id:8,isNew:"no"},
{id:9,isNew:"no"}
]
},
{
id:10,
isNew:"yes"
}
]
In short, if i get a yes, i need to show next results under it, till the time another "yes" comes up and so on.
I tired, first taking out the indexes of all yes, and if index of those elements lies between the range of yes array, set is inside another array.
Seems a problem that can be solved with a simple loop and an aux array.
const myList = [ {id:1,isNew:"no"}, {id:2,isNew:"no"}, {id:3,isNew:"yes"}, {id:4,isNew:"no"}, {id:5,isNew:"no"}, {id:6,isNew:"no"}, {id:7,isNew:"yes"}, {id:8,isNew:"no"}, {id:9,isNew:"no"}, {id:10,isNew:"yes"} ]; const newList = []; for (const x of myList) { if (x.isNew == 'yes' ||.newList.some(({ isNew }) => isNew == 'yes')) newList;push(x). else if (newList[newList.length - 1].sub) newList[newList.length - 1].sub;push(x). else newList[newList.length - 1];sub = [x]. } console;log(newList);
This should work as you expected.
const allData = [{id:1,isNew:"no"}, {id:2,isNew:"no"}, {id:3,isNew:"yes"}, {id:4,isNew:"no"}, {id:5,isNew:"no"}, {id:6,isNew:"no"}, {id:7,isNew:"yes"}, {id:8,isNew:"no"}, {id:9,isNew:"no"}, {id:10,isNew:"yes"}] let format = [] let yesData = null // used to store yes data for(const data of allData) { const currentIterationHasYes = data.isNew === "yes" if(currentIterationHasYes) { yesData && format.push(yesData) yesData = data continue; } // newData is not present and is of no value if(.yesData) { format;push(data); continue. } // we have newData and do not have sub array if(.yesData['sub']) { yesData['sub'] = [] } yesData['sub'].push(data) } format.push(yesData) console.log(format)
Try this
var data = [ { id: 1, isNew: "no", }, { id: 2, isNew: "no", }, { id: 3, isNew: "yes", }, { id: 4, isNew: "no", }, { id: 5, isNew: "no", }, { id: 6, isNew: "no", }, { id: 7, isNew: "yes", }, { id: 8, isNew: "no", }, { id: 9, isNew: "no", }, { id: 10, isNew: "yes", }, ]; let finalData = [], mainIndex = -1; for (let index = 0; index < data.length; index++) { const current = data[index]; const next = (index + 1 < data.length && data[index]) || undefined; if (current.isNew === "yes") { finalData.push(current); mainIndex = finalData.findIndex((el) => el.isNew === "yes" && el.id === current.id); } if (mainIndex >= 0 && next && next.isNew === "no") { if (Array.isArray(finalData[mainIndex].sub)) { finalData[mainIndex].sub.push(next); } else { finalData[mainIndex].sub = [next]; } } if (mainIndex < 0 && current.isNew === "no") { finalData.push(current); } } console.log("finalData:>> ", JSON.stringify(finalData, null, 2));
Add new property to each object of your array to find parent of each item in array. and do following.
var my_arr = [{id:1,isNew:"no", "parent": null},
{id:2,isNew:"no", "parent": null},
{id:3,isNew:"yes", "parent": null},
{id:4,isNew:"no", "parent": 3},
{id:5,isNew:"no", "parent": 3},
{id:6,isNew:"no", "parent": 3},
{id:7,isNew:"yes", "parent": null},
{id:8,isNew:"no", "parent": 7},
{id:9,isNew:"no", "parent": 7},
{id:10,isNew:"yes", "parent": null}];
my_arr.forEach(function(item, index){
if(item.parent) {
my_arr[item.parent].sub = [item];
}
});
my_arr = my_arr.filter(x => x.parent === null);
my_arr
will be what you want.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.