JS - sortare multipla array cu obiecte

Salutare,
Cum pot sorta array-ul de mai jos dupa multiple conditii

[
   {
      "denumire":"Produs 1",
      "stare1":"activ",
      "stare2":"activ"
   },
   {
      "denumire":"Produs 2",
      "stare1":"activ",
      "stare2":"inactiv"
   },
   {
      "denumire":"Produs 3",
      "stare1":"inactiv",
      "stare2":"activ"
   },
   {
      "denumire":"NON / Produs 4",
      "stare1":"inactiv",
      "stare2":"inactiv"
   },
   {
      "denumire":"Produs 5",
      "stare1":"activ",
      "stare2":"activ"
   },
   {
      "denumire":"Produs 6",
      "stare1":"inactiv",
      "stare2":"activ"
   },
   {
      "denumire":"NON / Produs 7",
      "stare1":"activ",
      "stare2":"inactiv"
   },
   {
      "denumire":"Produs 8",
      "stare1":"inactiv",
      "stare2":"inactiv"
   }
]

Oridinea si conditiile de afisare sunt urmatoarele:
1: stare1 == activ && stare2 == activ
2: stare1 == activ && stare2 == inactiv
3: stare2 == activ && stare 1 == inactiv
4: stare1 == inactiv && stare2 == inactiv
5: denumire == /^NON./i (tot ce incepe cu NON) && (stare1 == activ && stare2 == activ) && (stare1 == activ && stare2 == inactiv)

Multumesc!

const items = [{ ... }, { ... }, { ... }];

// 1: stare1 == activ && stare2 == activ
let filtru_1 = items.filter(function(item) {
  return item.stare1 === "activ" && item.stare2 === "activ";
});

// 2: stare1 == activ && stare2 == inactiv
// 3: stare2 == activ && stare 1 == inactiv
// 4: stare1 == inactiv && stare2 == inactiv

// 5: denumire == /^NON./i (tot ce incepe cu NON) && (stare1 == activ && stare2 == activ) && (stare1 == activ && stare2 == inactiv)
let filtru_5 = items.filter(function(item) {
  return item.denumire.match(/^NON./i) && ((item.stare1 === "activ" && item.stare2 === "activ") || (item.stare1 === "activ" && item.stare2 === "inactiv"));
});

2, 3, 4 le faci singur.

Cu filter am incercat initail si am inceput cu conditia 5, dupa care am concatenat variabilele, numai ca array-ul meu si-a multiplicat obiectele, Produsul 7 intra in conditia 2 si 5.
Practic am nevoie de acelasi array, numai ca sortat in acea ordine.

let testArray = [
    {
        "denumire":"Produs 1",
        "stare1":"activ",
        "stare2":"activ"
    },
    {
        "denumire":"Produs 2",
        "stare1":"activ",
        "stare2":"inactiv"
    },
    {
        "denumire":"Produs 3",
        "stare1":"inactiv",
        "stare2":"activ"
    },
    {
        "denumire":"NON / Produs 4",
        "stare1":"inactiv",
        "stare2":"inactiv"
    },
    {
        "denumire":"Produs 5",
        "stare1":"activ",
        "stare2":"activ"
    },
    {
        "denumire":"Produs 6",
        "stare1":"inactiv",
        "stare2":"activ"
    },
    {
        "denumire":"NON / Produs 7",
        "stare1":"activ",
        "stare2":"inactiv"
    },
    {
        "denumire":"Produs 8",
        "stare1":"inactiv",
        "stare2":"inactiv"
    }
];

function orderPosition(data) {
    if (data.denumire.match(/^NON./i) && ((data.stare1 === "activ" && data.stare2 === "activ") || (data.stare1 === "activ" && data.stare2 === "inactiv"))) {
        return 5;
    }
    if (data.stare1 === 'activ' && data.stare2 === 'activ') {
        return 1;
    }
    if (data.stare1 === 'activ' && data.stare2 === 'inactiv') {
        return 2;
    }
    if (data.stare1 === 'inactiv' && data.stare2 === 'activ') {
        return 3;
    }
    if (data.stare1 === 'inactiv' && data.stare2 === 'inactiv') {
        return 4;
    }
    return 6;
}
console.log(testArray.sort(function(a, b) {
    return orderPosition(a) - orderPosition(b);
}));

2 Likes