Mam klucze w pliku JSON i po przetworzeniu za pomocą kluczy nie znajdują się w kolejności numerycznej. Jakikolwiek sposób, aby to naprawić?

$.getJSON("file.json", function(thedata) {
  var items = [];
  $.each(thedata, function(key, val) {
    items.push(key);
  });

Plik JSON:

"3.5":"some data",
"8":"some data",
"13":"some data",
"17.5":"some data",
"18":"some data",

Klucze przyjdą w tej kolejności: 8, 13, 18, 3.5, 17.5

0
Hasen 16 październik 2017, 10:45

2 odpowiedzi

Najlepsza odpowiedź

Właściwości obiektu JSON nie mają żadnego zamówienia, więc obiekt utworzony przez deserializację JSON może mieć właściwości w dowolnej kolejności. *

Możesz uzyskać klucze, sortować je, a następnie pętla przez właściwości:

$.getJSON("file.json", function(thedata) {
  var items = [];
  Object.keys(thedata)
    .sort(function(left, right) { return left - right; })
    .forEach(function(key) {
      var val = thedata[key];
      // Use `key`, `val`...
    });
});

Kopia na żywo bez $.getJSON część:

var json =
    '{"3.5":"some data",' +
    '"8":"some data",' +
    '"13":"some data",' +
    '"17.5":"some data",' +
    '"18":"some data"' +
    '}';
var thedata = JSON.parse(json);
var items = [];
Object.keys(thedata)
  .sort(function(left, right) { return left - right; })
  .forEach(function(key) {
    var val = thedata[key];
    console.log(key + " = " + val);
  });

Alternatywnie zwróć dane jako tablicę tablic, w kolejności:

[
    ["3.5", "some data"],
    ["8", "some data"],
    ["13", "some data"],
    ["17.5", "some data"],
    ["18", "some data"]
]

Następnie:

$.getJSON("file.json", function(thedata) {
    thedata.forEach(function(entry) {
        var key = entry[0], val = entry[1];
        // Use `key`, `val` here
    });
});

Na żywo przykład (bez {x0}}):

var json =
    '[' +
        '["3.5", "some data"],' +
        '["8", "some data"],' +
        '["13", "some data"],' +
        '["17.5", "some data"],' +
        '["18", "some data"]' +
    ']';
var thedata = JSON.parse(json);
thedata.forEach(function(entry) {
    var key = entry[0], val = entry[1];
    console.log(key + " = " + val);
});

Jeśli możesz użyć funkcji ES2015 + (obsługują tylko najnowocześniejsze przeglądarki lub masz transpleję), można użyć zadania denerwującego w tym forEach:

const json =
    '[' +
        '["3.5", "some data"],' +
        '["8", "some data"],' +
        '["13", "some data"],' +
        '["17.5", "some data"],' +
        '["18", "some data"]' +
    ']';
const thedata = JSON.parse(json);
thedata.forEach(([key, val]) => {
    console.log(key + " = " + val);
});

* Od ES2015 właściwości obiektu JavaScript mają zamówienie, przynajmniej dla niektórych operacji, ale zwykle nie jest przydatne do polegania na tej kolejności.

5
T.J. Crowder 16 październik 2017, 08:01

Możesz uzyskać klucze za pomocą Object.keys() i użyj metody sort().

var obj = {
  "3.5": "some data",
  "8": "some data",
  "13": "some data",
  "17.5": "some data",
  "18": "some data"
}

var keys = Object.keys(obj).sort((a, b) => a - b);
console.log(keys)

Jeśli potrzebujesz również wartości, których możesz użyć Object.entries i sortuj według pierwszego elementu w tablicach, które będą kluczem.

var obj = {
  "3.5": "some data",
  "8": "some data",
  "13": "some data",
  "17.5": "some data",
  "18": "some data"
}

var entries = Object.entries(obj).sort((a, b) => a[0] - b[0]);
console.log(entries)
1
Nenad Vracar 16 październik 2017, 08:02