Как отсортировать объект по цифровым клавишам с вложенностью?

#javascript

#javascript

Вопрос:

У меня есть объект с цифровыми клавишами, сгруппированный по некоторому значению, поэтому он имеет вложенность:

 const toSort = {
'3': {
    "key1": "test",
    "key2": "test",
},
'testVslue': {
    '1': {
        "key1": "test",
        "key2": "test",
    },
    '2': {
        "key1": "test",
        "key2": "test",
    },
},
'4': {
    "key1": "test",
    "key2": "test",
},
 

}

Как я могу отсортировать объект по росту ключа, несмотря на вложенность, вот так:

 const sorted = {
'testVslue': {
    '1': {
        "key1": "test",
        "key2": "test",
    },
    '2': {
        "key1": "test",
        "key2": "test",
    },
},
'3': {
    "key1": "test",
    "key2": "test",
},
'4': {
    "key1": "test",
    "key2": "test",
},
 

}

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

1. Является ли вложенность только на один уровень глубиной?

2. @CKE да, только один

3. какая польза, поскольку элементы объекта доступны напрямую по их свойствам? их назначение памяти в любом случае может отличаться в зависимости от потребностей хост-системы

4. Мне нужно визуализировать данные по порядку в списке

5. если сортировать по алфавиту, порядок будет 3 4 testValue , это будет нормально?

Ответ №1:

https://exploringjs.com/es6/ch_oop-besides-classes.html#_traversal-order-of-properties

Собственные ключи свойств:

Извлекает ключи всех собственных свойств объекта в следующем порядке:

  • Во-первых, строковые ключи, которые являются целочисленными индексами (что это такое, объясняется в следующем разделе), в порядке возрастания числового порядка.
  • Затем все остальные строковые ключи в том порядке, в котором они были добавлены к объекту.
  • Наконец, все символьные ключи в том порядке, в котором они были добавлены к объекту.
 console.log(toSort);
// 3 4 testValue

const sorted = {};
Object.keys(toSort).sort().forEach(function(key) {
    sorted[key] = toSort[key];
});

console.log(sorted);
// 3 4 testValue
 

итак, другой способ — разделить его.

 const sortedInteger = {};
const sortedString = {};
Object.keys(toSort).sort().forEach(function(key) {
    if (isNaN(key)) {
        sortedString[key] = toSort[key];
    }
    else {
        sortedInteger[key] = toSort[key];
    }
});

console.log(sortedString);
console.log(sortedInteger);
 

или как насчет использования Map
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

 const sortedIntegerArray = [];
let sortedMap = new Map()

Object.keys(toSort).sort().forEach( (key) => {
    if (isNaN(key)) {
        sortedMap.set(key, toSort[key])
    }
    else {
        sortedIntegerArray.push(key);
    }
});

sortedIntegerArray.forEach( (key) => {
    sortedMap.set(key, toSort[key])
});

console.log(sortedMap)

// Map {
//     'testValue' => {
//       '1': { key1: 'test', key2: 'test' },
//       '2': { key1: 'test', key2: 'test' }
//     },
//     '3' => { key1: 'test', key2: 'test' },
//     '4' => { key1: 'test', key2: 'test' }
//   }