Timmy Lee
Timmy Lee

Reputation: 795

Reordering data in JSON Object

Consider this Javascript object and code:

Javascript Object

{
    "thing":{
       "data":"some data",
       "thumb":"some data",
       "data1":"some data",
       "data2":"some data",
       "data3":"some data",
    },
    "extra1":[
       {
          "extradata1":"some data",
          "extradata2":"some data",
          "extradata3":"some data",
          "extradata4":"some data"
       },
       {
          "extradata1":"some data",
          "extradata2":"some data",
          "extradata3":"some data",
          "extradata4":"some data"
       }
    ],
    "extra2":[
       {
          "hightlighted": false, 
          "extradata2":"some data",
       },
       {
          "hightlighted": false, 
          "extradata2":"some data",
       },
       {
          "hightlighted": true, 
          "extradata2":"some data",
       },
       {
          "hightlighted": false, 
          "extradata2":"some data",
       }
     ]
}

I want to find an object in 'extra2' based on if a value is true or not, remove it and add it back into the same json object but at the top of the 'extra2' object.

Currently my thinking is this:

for (var i=0; i<object.extra2.length; i++){
        if (object.extra2[i].highlighted === true) {
            highlightStore = object.extra2[i];
            delete object.extra2[i]
            object.extra2.push(highlightStore)
        }
    }

However I can't seem to get this to work

Upvotes: 1

Views: 86

Answers (3)

Thomas Hennes
Thomas Hennes

Reputation: 9949

I wouldn't mutate the original data, that's always a bad idea, so you don't want to use mutating methods like push, shift etc.

Create new variables to hold partial and/or transformed copies of the original instead.

In your particular case, you could do:

const extra2sorted = [ ...data.extra2.filter(v => v.hightlighted), ...data.extra2.filter(v => !v.hightlighted) ]

Upvotes: 1

Scott Sauyet
Scott Sauyet

Reputation: 50797

Another possibility is to sort the data in question, using the "hightlighted" property. (Notice the misspelling. This presumably should be "highlighted".) That might look like this:

const object = {thing: {data: "some data", thumb: "some data", data1: "some data", data2: "some data", data3: "some data"}, extra1: [{extradata1: "some data", extradata2: "some data", extradata3: "some data", extradata4: "some data"}, {extradata1: "some data", extradata2: "some data", extradata3: "some data", extradata4: "some data"}], extra2: [{hightlighted: false, extradata2: "some data"}, {hightlighted: false, extradata2: "some data"}, {hightlighted: true, extradata2: "some data"}, {hightlighted: false, extradata2: "some data"}]}

object .extra2 .sort (({hightlighted: h1}, {hightlighted: h2}) =>
  (h1 && !h2) ? -1 : (h2 && ! h1) ? 1 : 0
)

console .log (object)
.as-console-wrapper {min-height: 100% !important; top: 0}

Upvotes: 0

palaѕн
palaѕн

Reputation: 73906

The issue is here:

object.extra2.push(highlightStore)

The array push() method adds one or more elements to the end of an array, but as you need to add the item at the top you simply need to use the array unshift() method like:

object.extra2.unshift(highlightStore)

As the unshift() method adds one or more elements to the beginning of an array.

Upvotes: 2

Related Questions