user4035841
user4035841

Reputation:

Sort Array of objects by number in specific order

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

Answers (7)

Guilherme Branco
Guilherme Branco

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

Rajib
Rajib

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

Michael Mishin
Michael Mishin

Reputation: 571

Use sort with callback function:

given.sort((a,b) => b.number === 0 && a.number !== 0 ? -1 : 0);

Upvotes: 0

felixmosh
felixmosh

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

Nina Scholz
Nina Scholz

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

janmbaco
janmbaco

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

Yury Tarabanko
Yury Tarabanko

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

Related Questions