Сортировка по свойству объекта, а затем добавление определенного объекта в конец массива внутри объекта вложенных массивов

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

У меня есть следующий объект с вложенными массивами объектов.

Я пытаюсь написать простую функцию Javascript для сортировки объектов в этих массивах в алфавитном порядке по свойству «label», а затем поместить объект с меткой «other» в конец этого массива.

Вот мое текущее решение, но мне интересно, есть ли более чистый, более декларативный способ подойти к этому решению?

https://jsfiddle.net/3fjq50Lb/

 let things = {
  "animals": [{
      "id": 0,
      "label": "cat"
    },
    {
      "id": 100,
      "label": "Undefined"
    },
    {
      "id": 200,
      "label": "turtle"
    },
    {
      "id": 300,
      "label": "Other"
    },
  ],
  "colors": [{
      "id": 0,
      "label": "yellow"
    },
    {
      "id": 100,
      "label": "green"
    },
    {
      "id": 200,
      "label": "red"
    },
    {
      "id": 300,
      "label": "blue"
    }
  ]
}

let sortedThings = {};
Object.entries(things).forEach((entry) => {
  let key = entry[0];
  let otherOption = entry[1].filter((o)=> o.label === "Other");
  console.log(otherOption)
  let vals = entry[1].sort((a, b) => (a.label > b.label) ? 1 : ((b.label > a.label) ? -1 : 0)).filter((s) => s.label !== "Undefined")
  if(otherOption.length){
     vals = vals.filter((s) => s.label !== "Other");
     vals = vals.concat(otherOption);
  }
})
  

Комментарии:

1. Пожалуйста, опубликуйте свой код с Object.entries() итерацией, даже если это не сработает, иначе мы не сможем помочь вам исправить это.

2. @Bergi — я обновил свое текущее решение

3. » У меня возникли трудности с возвратом нового объекта с помощью этих строковых ключей » — все, чего вам, похоже, не хватает, это sortedThings[key] = vals; в конце итерации.

Ответ №1:

Его можно оптимизировать следующим образом:

  1. Сначала удалите значение «Undefined», чтобы оно не замедляло сортировку.
  2. Во время сортировки принудительно определите «Другое» как элемент большего размера, чтобы переместить его в конец массива.

 const things = {
  "animals": [{
      "id": 0,
      "label": "cat"
    },
    {
      "id": 100,
      "label": "Undefined"
    },
    {
      "id": 200,
      "label": "turtle"
    },
    {
      "id": 300,
      "label": "Other"
    },
  ],
  "colors": [{
      "id": 0,
      "label": "yellow"
    },
    {
      "id": 100,
      "label": "green"
    },
    {
      "id": 200,
      "label": "red"
    },
    {
      "id": 300,
      "label": "blue"
    }
  ]
};

const sortedThings = Object.entries(things).reduce((obj, [key, value]) => 
    (obj[key] = value
        .filter(item => item.label != "Undefined")
        .sort((a, b) => (
            a = a.label.toLowerCase(), 
            b = b.label.toLowerCase(), 
            a == b ? 0 : b != "other" amp;amp; (a == "other" || a > b) ? 1 : -1
        )), 
        obj
    ), 
{});

console.log(sortedThings);