Как отсортировать объект по сумме результатов значений?
Представлен такой объект:
let obj = {
0: { min: '2', max: '5' }, // 3
1: { min: '12', max: '34' }, // 22
2: { min: '1', max: '2' }, // 1
3: { min: '6', max: '123' }, // 117
4: { min: '-20', max: '-4' }, // -16
};
console.log(obj);
Нужно получить результат после сортировки:
let obj = {
4: { min: '-20', max: '-4' }, // -16
2: { min: '1', max: '2' }, // 1
0: { min: '2', max: '5' }, // 3
1: { min: '12', max: '34' }, // 22
3: { min: '6', max: '123' }, // 117
};
Ответы (2 шт):
Для сортировки это должен быть массив. А массив можно отсортировать например так:
let arr = [
{ min: "2", max: "5" }, // 3
{ min: "12", max: "34" }, // 22
{ min: "1", max: "2" }, // 1
{ min: "6", max: "123" }, // 117
{ min: "-20", max: "-4" }, // -16
];
console.log(`arr`, arr);
const sorted = arr
.map((item) => ({ ...item }))
.sort((a, b) => a.max - a.min - (b.max - b.min));
console.log(`sorted`, sorted);
Как правильно выразился Konstantin Modin, сортировать нужно массив, так как это структура больше подходит для сортировки, чем объект. Думаю, стоит обратить внимание на алгоритмы и структуры данных. Если вам нужно потом пройти циклом, то тут тоже получается, что массив подходит лучше, чем объект. Но сделал алгоритм под ваши требования.
P.S. Добавил вариант с использованием только методов массива, для меньшего объема конструкций.
P.P.S. Во всех примерах получается, что из большего вычитается меньшее. -4 - (-20) = 16.
let obj = {
0: {
min: '2',
max: '5'
}, // 3
1: {
min: '12',
max: '34'
}, // 22
2: {
min: '1',
max: '2'
}, // 1
3: {
min: '6',
max: '123'
}, // 117
4: {
min: '-20',
max: '-4'
}, // 16
};
function getSortedObject(obj) {
const arr = Object.entries(obj).map(([key, value]) => value); // получаем массив из значений полей объекта
const sorted = arr.sort((a, b) => (a.max - a.min) - (b.max - b.min)); // сортируем массив значений
const result = {}; // создаем пустой объект, в который запишем новые значения.
for (let i = 0; i < sorted.length; i++) {
result[i.toString()] = sorted[i]; // в цикле заполняем значения объекта result
}
return result; // возвращаем итоговый объект
}
console.log(getSortedObject(obj));
function getSortedObject2(obj) {
const result = {};
const arr = Object.entries(obj)
.map(([key, value]) => value)
.sort((a, b) => (a.max - a.min) - (b.max - b.min))
.forEach((element, index) => {
result[index.toString()] = element;
})
return result;
}
console.log(getSortedObject2(obj));