简体   繁体   中英

arrange data in some format

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM