0

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

7 Answers 7

2

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.

Sign up to request clarification or add additional context in comments.

Comments

2

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; }

Comments

1

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));

Comments

0

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)

Comments

0

Use sort with callback function:

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

Comments

0

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);

Comments

0

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.