#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:
Его можно оптимизировать следующим образом:
- Сначала удалите значение «Undefined», чтобы оно не замедляло сортировку.
- Во время сортировки принудительно определите «Другое» как элемент большего размера, чтобы переместить его в конец массива.
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);