Pertanyaan Menyortir Array Objek JavaScript Urutan Tertentu (menggunakan fungsi yang ada)


Mengingat berbagai objek:

{
    kunci: "a",
    nilai: 42
},
{
    kunci: "d",
    nilai: 28
},
{
    kunci: "c",
    nilai: 92
},
{
    kunci: "b",
    nilai: 87
}

dan serangkaian kunci:

["c", "a", "b", "d"]

Apakah ada fungsi ECMAScript atau pustaka JavaScript pihak ketiga yang memungkinkan Anda menyortir - dalam satu baris / fungsi panggilan - array pertama objek, ke cocok dengan urutan kunci ditentukan dalam larik kedua, sehingga hasilnya adalah:

{
    kunci: "c",
    nilai: 92
},
{
    kunci: "a",
    nilai: 42
},
{
    kunci: "b",
    nilai: 87
},
{
    kunci: "d",
    nilai: 28
}

Pertanyaan lain yang menyediakan fungsi atau algoritme:

Pertanyaan serupa / terkait:


16
2017-09-17 20:21


asal


Jawaban:


Cukup gunakan indexOf untuk mengonversi kunci ke urutan yang benar:

var order = ["c", "a", "b", "d"];
_.sortBy(arr, function(obj){ 
    return _.indexOf(order, obj.key);
});

Biola

Jika ada banyak kunci, maka akan menguntungkan untuk membuat hash-map dari array, seperti:

var order = ["c", "a", "b", "d"];
var orderMap = {};
_.each(order, function(i) { orderMap[i] = _.indexOf(order, i); });

Ini membuat pencarian kunci konstan waktu daripada O (n). (Biola)


29
2017-09-17 20:27



Jawaban yang bagus sejauh ini. Berpikir bahwa berikut ini mungkin juga merupakan solusi alternatif di JS polos:

var arr = arr.sort(function(a,b) {
    return order.indexOf( a.key ) > order.indexOf( b.key );
    //for the sake of recent versions of Google Chrome use:
    //return a.key.charCodeAt(0) > b.key.charCodeAt(0); or return a.key.charCodeAt(0) - b.key.charCodeAt(0);
});

var arr = [
    {
        key: "a",
        value: 42
    },
    {
        key: "d",
        value: 28
    },
    {
        key: "c",
        value: 92
    },
    {
        key: "b",
        value: 87
    }
];

var order = ["c", "a", "b", "d"];

console.log( 'Original: ', JSON.stringify( arr ) );

var arr = arr.sort(function(a,b) {
      return order.indexOf( a.key ) > order.indexOf( b.key );
});

console.log( 'Ordered: ', JSON.stringify( arr ) );


15
2017-11-19 18:20



Saya tidak bisa mengklaim bahwa ini adalah paling cara yang efisien, tetapi Anda dapat menggunakan key untuk setiap objek sebagai kunci untuk properti di objek lain. Kemudian hanya mengaksesnya dengan kunci ini.

for (x = 0; x < objn.length; x++) {
    newobj[objn[x].key] = objn[x];
}
objn = [];
for (x = 0; x < keys.length; x++) {
    objn.push(newobj[keys[x]]);
}
console.log(objn);

http://jsfiddle.net/WdehF/


2
2017-09-17 20:32