Reputation:
i have got the following array ob objects:
let given = [
{id: 1, number: 43},
{id: 2, number: 0},
{id: 3, number: 3},
{id: 4, number: undefined},
{id: 5, number: 1},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 8, number: 36},
{id: 69, number: 0}
]
and want to sort it in this way
let expected = [
{id: 1, number: 43},
{id: 3, number: 3},
{id: 4, number: undefined},
{id: 5, number: 1},
{id: 8, number: 36},
{id: 2, number: 0},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 69, number: 0}
]
all objects with 0 number should be in the end of the array but the previous order should still exist
i tried array.sort() but have not received the desired result
Upvotes: 0
Views: 280
Reputation: 31
let given = [
{id: 1, number: 43},
{id: 2, number: 0},
{id: 3, number: 3},
{id: 4, number: undefined},
{id: 5, number: 1},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 8, number: 36},
{id: 69, number: 0}
]
var arr = []
for(var i = 0; i < given.length; i++){
if(given[i].number === 0){
arr.push(given[i]);
}
}
given = given.filter(item => item.number !== 0);
given = given.concat(arr)
console.log(given)
Upvotes: 0
Reputation: 24
let given = [
{ id: 1, number: 43 },
{ id: 2, number: 0 },
{ id: 3, number: 3 },
{ id: 4, number: undefined },
{ id: 5, number: 1 },
{ id: 6, number: 0 },
{ id: 7, number: 0 },
{ id: 8, number: 36 },
{ id: 69, number: 0 },
];
var zeroarray = given.filter((val) => {
if (val.number === 0) return val;
});
var nonzeroarray = given.filter((val) => {
if (val.number != 0) return val;
});
var final=[...nonzeroarray,...zeroarray];
console.log(final);
Upvotes: 0
Reputation: 571
Use sort with callback function:
given.sort((a,b) => b.number === 0 && a.number !== 0 ? -1 : 0);
Upvotes: 0
Reputation: 35553
You can split your given array into 2, zeros & noneZeros while remaining the original order with Array.reduce.
let given = [
{id: 1, number: 43},
{id: 2, number: 0},
{id: 3, number: 3},
{id: 4, number: undefined},
{id: 5, number: 1},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 8, number: 36},
{id: 69, number: 0},
];
const x = given.reduce(
(result, item) => {
if (item.number === 0) {
result.zeros.push(item);
} else {
result.noneZeros.push(item);
}
return result;
},
{zeros: [], noneZeros: []}
);
console.log(x.noneZeros.concat(x.zeros));
Upvotes: 1
Reputation: 386660
You could sort with the delta of the check with zero.
let given = [{ id: 1, number: 43 }, { id: 2, number: 0 }, { id: 3, number: 3 }, { id: 4, number: undefined }, { id: 5, number: 1 }, { id: 6, number: 0 }, { id: 7, number: 0 }, { id: 8, number: 36 }, { id: 69, number: 0 }];
given.sort(({ number: a }, { number: b }) => (a === 0) - (b === 0));
console.log(given);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 2
Reputation: 350
You can do this with two arrays
let given = [
{id: 1, number: 43},
{id: 2, number: 0},
{id: 3, number: 3},
{id: 4, number: undefined},
{id: 5, number: 1},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 8, number: 36},
{id: 69, number: 0}
]
var a = [];
var b = [];
for(let data of given){
if(data.number == 0){
a.push(data)
} else {
b.push(data)
}
}
var c = b.concat(a);
console.log(c)
Upvotes: 0
Reputation: 45121
You first filter non-zero objects, than zero objects. Then concat both arrays.
let given = [
{id: 1, number: 43},
{id: 2, number: 0},
{id: 3, number: 3},
{id: 4, number: undefined},
{id: 5, number: 1},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 8, number: 36},
{id: 69, number: 0}
]
const expected = [
...given.filter(item => item.number !== 0),
...given.filter(item => item.number === 0)
]
console.log(JSON.stringify(expected))
Or you could use a single loop if you think two loops might affect your app performance.
Upvotes: 2