Reputation: 795
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
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
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
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