Pertanyaan Menyortir Obyek JSON


Memiliki masalah saat mencoba mengurutkan objek JSON. Pada dasarnya, orang dapat menambahkan produk dalam urutan acak apa pun ke formulir pesanan kami, tetapi pesanan yang ditampilkan dalam ringkasan perlu bagaimana kami ingin mereka diposisikan (bukan pesanan yang mereka pilih), jadi itulah mengapa saya harus mengurutkan berdasarkan 'id' (atau kami akan mengurutkan berdasarkan bidang 'pos' nanti)

Intinya, saya perlu mengurutkan berdasarkan id ascending. 1,2,103 bukan 2,103,1

Sepertinya saya mengalami masalah karena indeks ke objek individu adalah angka (atau hanya fakta bahwa mereka ada di sana ...).

Saya perlu melakukan sesuatu di sepanjang baris array.sort (function (a, b) {return a.id-b.id}); tapi saya menganggap itu tidak berhasil karena 1, bukan array (objeknya), dan 2, ia memiliki indeks sial (yang saya perlukan untuk bagian lain dari kode saya) ...

Ada ide ????

var products = {
    "2": {
        "id": "2",
        "price": "119",
        "quantity": "1",
        "thumb": "img\/store\/comp-08n.png"
    },
    "103": {
        "id": "103",
        "price": "109",
        "quantity": "1",
        "thumb": "img\/store\/basketballhoop.png"
    },
    "1": {
        "id": "1",
        "price": "309",
        "quantity": "1",
        "thumb": "img\/store\/comp-08.png"
    }
};

5
2018-05-27 03:27


asal


Jawaban:


Berapa banyak barang yang Anda butuhkan dalam pesanan Anda? Anda dapat dengan aman mengurutkan 10000 item dalam larik Javascript tanpa banyak masalah kecepatan. Mengapa Anda tidak bekerja dengan array sebenarnya?

Anda bahkan bisa menyuntikkan properti khusus ke dalamnya, kira-kira kira-kira seperti itu

var products = [...];

products.findById = function(id) {
   for (var i=0, len=this.length; i<len; i++) {
      if (id == this[i].id) return this[i];
   }
   return null;
};

alert( products.findById(103).price );   // -> 119

dan tambahkan penyortir yang sudah ditentukan sebelumnya

products.sortById = function() {
    this.sort(function(a,b) {
        return a.id - b.id;
    });
};

products.sortById();   // sort array by product id

** EDIT **

Di sisi PHP Anda, Anda mungkin memiliki sesuatu seperti:

$products = array(
    2 => array( 'id' => 2, ... ),
    103 => array( 'id' => 103, ... ),
    1 => array( 'id' => 1, ... ),
);

// get a JSON array
$jsonArray = json_encode(array_values($products));

akan mengembalikan apa yang Anda butuhkan.

** CATATAN **

Anda tidak harus secara eksplisit mengatur indeks saat menambahkan item baru dalam array Anda. Gunakan array push berfungsi, seperti

products.push({id:123, price:200.49, quantity:1, thumb:'/path/to/file'});

Menghapus item agak sedikit rumit, namun, sesuatu seperti:

products.removeById = function(id) {
   for (var i=0, len=this.length; i<len; i++) {
      if (id == this[i].id) return this.splice(i, 1)[0];
   }
   return null;
};

products.removeById(123);    // -> returns the removed element! or null if nothing was removed

Lihat demo sini (gunakan alat pengembangan Chrome untuk keluaran konsol).


5
2018-05-27 03:31



Ada dua jenis koleksi di JavaScript dan di JSON:

  1. key / value map (object) - koleksi tidak berurutan dan
  2. Array - index / value map (array) - kumpulan yang dipesan.

Menurut definisi, hanya array yang dapat diurutkan. Gunakan array.


4
2018-05-27 03:32



solusi rekursif, tidak berurusan dengan array, javascript

var alphabetizeJSON = function(obj){
    var key,
        array = [],
        stringifiedValuesObj = {},
        jsonKeyVal = "",
        i,
        keyName;

    for (key in obj) {
        if (typeof obj[key] === "object"){
            stringifiedValuesObj[key] = "" + alphabetizeJSON(obj[key]);
        } else {
            obj[key] = obj[key].replace(/\"/gi,'\\\"');
        }
        array.push(key);
    }

    array.sort();

    for (i = 0; i < array.length; i++){
        keyName = array[i];
        jsonKeyVal += '"' + keyName + '": ';
        jsonKeyVal += stringifiedValuesObj[keyName] ? stringifiedValuesObj[keyName] : '"' + obj[keyName] + '"';
        if (i < array.length - 1 ) {
            jsonKeyVal += ',';
        }
    }

    return '{ ' + jsonKeyVal + '}';
};

2
2018-03-04 01:15



Periksa JSONArrays. Mereka mungkin apa yang Anda butuhkan. http://json.org/java/


0
2018-05-27 03:33



Memang, Anda harus bisa menggunakan array daripada objek untuk pekerjaan ini, dan itu akan menyelesaikan banyak kesulitan Anda.

Jika Anda tidak dapat melakukan itu, Anda dapat mengonversi objek ke dalam array untuk memberikannya memesan ... sesuatu seperti ini:

var a = []
for (var p in obj) {
  a[+p] = obj[p]
}

Jika Anda tidak bisa melakukan itu, Anda dapat secara dinamis menambahkan informasi ke halaman dalam urutan yang Anda inginkan (berikut ini adalah ide yang buruk) ...

for (var i = 0; i < 10000; i++) {
  if (obj[i] !== undefined) {
    add_to_page(obj[i])  //define this somewhere
  }
}

0
2018-05-27 03:39