$ .parseJSON меняет порядок ассоциативных массивов - PullRequest
0 голосов
/ 04 ноября 2019

Я получаю отсортированный по алфавиту (по значениям) json через AJAX:

console.log(data);

, который показывает:

{"0":"","23":"Granta","20":"Vesta SW Cross","24":"Zetta"}

, но когда я его анализирую:

var models = $.parseJSON(data);
console.log(models);

он разбивает алфавитный порядок и показывает:

Object { 0: "", 20: "Vesta SW Cross", 23: "Granta", 24: "Zetta" }

, затем я заполняю элемент select:

$.each(models, function(key, value) {
    model.append($('<option></option>').text(value).val(key));
});

есть ли способ снова отсортировать эти опции по алфавиту по значениям?

1 Ответ

0 голосов
/ 04 ноября 2019

Если вы должны делать все на стороне клиента, вы можете преобразовать и отсортировать исходный ответ

$.getJSON(url).done(models => {
  const sorted = Object.entries(models).sort(([k1, v1], [k2, v2]) =>
      v1.localeCompare(v2))
  model.append(sorted.map(([value, text]) => $('<option>', { value, text })))
})

В противном случае я бы предложил исправить это в источнике, чтобы он возвращалсяболее полная модель данных.

Например, если у вас есть что-то вроде

$models = [
    0  => '',
    23 => 'Granta',
    20 => 'Vesta SW Cross',
    24 => 'Zetta'
];

Сопоставьте это с лучшей структурой данных, например,

$data = [];
foreach ($models as $value => $text) {
    $data[] = ['value' => $value, 'text' => $text];
}
header('Content-type: application/json');
echo json_encode($data);
exit;

. строка JSON, такая как

[
  {
    "value": 0,
    "text": ""
  },
  {
    "value": 23,
    "text": "Granta"
  },
  {
    "value": 20,
    "text": "Vesta SW Cross"
  },
  {
    "value": 24,
    "text": "Zetta"
  }
]

, которая находится в порядке и содержит все необходимые данные

$.getJSON(url).done(models => {
  model.append(models.map(props => $('<option>', props)))
})
...