J'ai les objets ob de tableau suivants:

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

Et je veux le trier de cette façon

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

Tous les objets avec un nombre 0 doivent être à la fin du tableau mais l'ordre précédent doit toujours exister

J'ai essayé array.sort () mais je n'ai pas reçu le résultat souhaité

0
Gordon Freeman 3 juin 2020 à 16:17

7 réponses

Meilleure réponse

Vous filtrez d'abord les objets non nuls plutôt que les objets nuls. Puis concattez les deux tableaux.

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

Ou vous pouvez utiliser une seule boucle si vous pensez que deux boucles peuvent affecter les performances de votre application.

3
Yury Tarabanko 3 juin 2020 à 13:21
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)
0
Guilherme Branco 3 juin 2020 à 13:32

Vous pouvez trier avec le delta du chèque avec zéro.

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; }
2
Nina Scholz 3 juin 2020 à 13:26

Vous pouvez diviser votre tableau donné en 2, zéros et noneZeros tout en restant dans l'ordre d'origine avec 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));
1
felixmosh 3 juin 2020 à 13:27
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);
0
Rajib 3 juin 2020 à 13:30

Vous pouvez le faire avec deux tableaux

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)
0
janmbaco 3 juin 2020 à 13:25

Utilisez le tri avec la fonction de rappel:

given.sort((a,b) => b.number === 0 && a.number !== 0 ? -1 : 0);
0
Michael Mishin 3 juin 2020 à 13:27