сортировка индекса объекта в JavaScript - PullRequest
0 голосов
/ 23 мая 2019

Я бы хотел отсортировать индексацию объекта как array.sort

Ввод

"a":{"label":"0",isEnabled":false,"status":1},
"1":{"label":"1",isEnabled":false,"status":1},
"$":{"label":"2",isEnabled":false,"status":1},
"B":{"label":"3",isEnabled":false,"status":1},    
"0":{"label":"5",isEnabled":false,"status":1},
"/":{"label":"6",isEnabled":false,"status":1}

ожидаемый результат

    "$":{"label":"2",isEnabled":false,"status":1},
    "/":{"label":"6",isEnabled":false,"status":1},
    "0":{"label":"5",isEnabled":false,"status":1},
    "1":{"label":"1",isEnabled":false,"status":1},        
    "a":{"label":"0",isEnabled":false,"status":1},
    "B":{"label":"3",isEnabled":false,"status":1}

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

 "0":{"label":"5",isEnabled":false,"status":1},
    "1":{"label":"1",isEnabled":false,"status":1},
    "$":{"label":"2",isEnabled":false,"status":1},
    "/":{"label":"6",isEnabled":false,"status":1},    
    "a":{"label":"0",isEnabled":false,"status":1},
    "B":{"label":"3",isEnabled":false,"status":1}

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Поскольку порядок свойств объекта не гарантирован , следующая лучшая вещь для вас - Карта .При использовании Map порядок вставки учитывается, и вы можете использовать его в качестве индекса:

Объект Map содержит пары ключ-значение и запоминает исходный порядок вставки ключей.

let obj = { "a":{"label":"0",isEnabled:false,"status":1}, "1":{"label":"1",isEnabled:false,"status":1}, "$":{"label":"2",isEnabled:false,"status":1}, "B":{"label":"3",isEnabled:false,"status":1}, "0":{"label":"5",isEnabled:false,"status":1}, "/":{"label":"6",isEnabled:false,"status":1} }

let regEx = new RegExp(/[^a-zA-Z\d\s:]/)

let sortedKeys = Object.keys(obj).sort((a, b) => {
  if (regEx.test(a) && regEx.test(b))
    return a.charCodeAt(0) - b.charCodeAt(0)
  else
    return a.localeCompare(b, 'en', { numeric: true, caseFirst: 'upper'})
})

let mapped = sortedKeys.reduce((r,c) => (r.set(c, obj[c]), r), new Map())

console.log('keys: ', Array.from(mapped.keys()))
console.log('values: ', Array.from(mapped.values()))
0 голосов
/ 23 мая 2019

Хорошо, ключи объектов отсортированы, а затем использованы для отображения.

let obj = {
  "a": {
    "label": "0",
    "isEnabled": false,
    "status": 1
  },
  "1": {
    "label": "1",
    "isEnabled": false,
    "status": 1
  },
  "$": {
    "label": "2",
    "isEnabled": false,
    "status": 1
  },
  "B": {
    "label": "3",
    "isEnabled": false,
    "status": 1
  },
  "0": {
    "label": "5",
    "isEnabled": false,
    "status": 1
  },
  "/": {
    "label": "6",
    "isEnabled": false,
    "status": 1
  }
};

// Get keys in sorted order and print.
const arrKeys = Object.getOwnPropertyNames(obj).sort((a, b) => a < b);

arrKeys.forEach(k => console.log(obj[k]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...