Apakah mungkin untuk mengurutkan dan mengatur ulang array yang terlihat seperti ini:
itemsArray = [
['Anne', 'a'],
['Bob', 'b'],
['Henry', 'b'],
['Andrew', 'd'],
['Jason', 'c'],
['Thomas', 'b']
]
untuk mencocokkan pengaturan array ini:
sortingArr = [ 'b', 'c', 'b', 'b', 'a', 'd' ]
Sayangnya, saya tidak memiliki ID untuk melacak. Saya perlu memprioritaskan item-array agar sesuai dengan sortingArr sedekat mungkin.
Memperbarui:
Ini adalah output yang saya cari:
itemsArray = [
['Bob', 'b'],
['Jason', 'c'],
['Henry', 'b'],
['Thomas', 'b']
['Anne', 'a'],
['Andrew', 'd'],
]
Adakah yang tahu bagaimana ini bisa dilakukan?
javascript
pengguna1448892
sumber
sumber
Jawaban:
Sesuatu seperti:
Berikut kode yang lebih pendek, tetapi merusak
sorting
array:sumber
Satu baris jawaban.
sumber
itemsArray
. Tergantung pada persyaratan kinerja, itu akan jauh lebih aman untuk dilakukanitemsArray.slice().sort(...)
.sortingArr
berisi semua nilai diitemsArray
. Cara mengatasinya adalah mendorong item ke bagian belakang array jika tidak ada disortingArr
:allProducts.sort((product1, product2) => { const index1 = manualSort.indexOf(product1.id); const index2 = manualSort.indexOf(product2.id); return ( (index1 > -1 ? index1 : Infinity) - (index2 > -1 ? index2 : Infinity) ); });
Jika Anda menggunakan fungsi pengurutan array asli, Anda bisa meneruskan pembanding khusus untuk digunakan saat mengurutkan array. Komparator harus mengembalikan angka negatif jika nilai pertama kurang dari yang kedua, nol jika mereka sama, dan angka positif jika nilai pertama lebih besar.
Jadi jika saya mengerti contoh yang Anda berikan dengan benar, Anda dapat melakukan sesuatu seperti:
sumber
indexOf
mengembalikan indeks pertama.sortingArr
unik - yang, untungnya, mereka dalam kasus saya :)sortingArray
luar fungsi untuk avoir mendeklarasikan ulang pada setiap iterasi pengurutanKasus 1: Pertanyaan Asli (Tidak Ada Perpustakaan)
Banyak jawaban lain yang berfungsi. :)
Kasus 2: Pertanyaan Asli (Lodash.js atau Underscore.js)
Kasus 3: Urutkan Array1 seolah-olah Array2
Saya menduga bahwa kebanyakan orang datang ke sini mencari yang setara dengan PHP's array_multisort (saya lakukan), jadi saya pikir saya akan memposting jawaban itu juga. Ada beberapa opsi:
1. Ada implementasi JS yang ada dari array_multisort () . Terima kasih kepada @Adnan karena menunjukkannya di komentar. Tapi ini cukup besar.
2. Tulis milik Anda sendiri. ( Demo JSFiddle )
3. Lodash.js atau Underscore.js (keduanya populer, perpustakaan kecil yang berfokus pada kinerja) menawarkan fungsi pembantu yang memungkinkan Anda untuk melakukan ini:
... Yang akan (1) mengelompokkan sortArray menjadi
[index, value]
pasangan, (2) mengurutkannya berdasarkan nilai (Anda juga dapat memberikan panggilan balik di sini), (3) mengganti setiap pasangan dengan item dari itemArray pada indeks yang pasangan berasal dari.sumber
ini mungkin terlambat tetapi, Anda juga dapat menggunakan beberapa versi kode yang dimodifikasi di bawah ini dalam gaya ES6. Kode ini untuk array seperti:
Operasi yang sebenarnya:
Operasi aktual di ES5:
Harus menghasilkan
arrayToBeSorted = [3,5]
Tidak menghancurkan array referensi.
sumber
[{name: "1"}, {name: "2"}, {name: "3"}, ...]
.Saya akan menggunakan objek perantara (
itemsMap
), sehingga menghindari kompleksitas kuadratik:Lihat http://jsfiddle.net/eUskE/
sumber
http://jsfiddle.net/s7b2P/
Urutan yang dihasilkan: Bob, Jason, Henry, Thomas, Anne, Andrew
sumber
Kenapa tidak seperti itu
Fungsi peta mungkin tidak tersedia di semua versi
Javascript
sumber
sumber
Inilah yang saya cari dan saya lakukan untuk mengurutkan Array of Array berdasarkan Array lain:
sumber
Saya harus melakukan ini untuk muatan JSON yang saya terima dari API, tetapi itu tidak sesuai urutan yang saya inginkan.
Array menjadi array referensi, yang Anda inginkan array kedua diurutkan berdasarkan:
Saya melakukan ini sebagai objek karena ini akan memiliki properti lain pada akhirnya.
Array yang dibuat:
Digunakan ini dengan set hasil dari database. Saya tidak tahu seberapa efisien itu, tetapi dengan beberapa kolom yang saya gunakan, itu berfungsi dengan baik.
sumber
Untuk mendapatkan array yang dipesan baru, Anda bisa mengambil
Map
dan mengumpulkan semua item dengan kunci yang diinginkan dalam array dan memetakan kunci yang diinginkan dengan mengambil elemen yang diayak dari grup yang diinginkan.sumber
{}
bukannyaMap
🤷♂️Solusi ini akan menambahkan objek di akhir jika kunci pengurutan tidak ada dalam array referensi
sumber
ini seharusnya bekerja:
sumber
Anda dapat mencoba metode ini.
sumber
ES6
Lebih banyak contoh dengan berbagai input array
sumber
Jika Anda tiba di sini perlu melakukan ini dengan berbagai objek, berikut adalah adaptasi dari jawaban luar biasa @Durgpal Singh:
sumber
Gunakan metode $ .inArray () dari jQuery. Anda kemudian dapat melakukan sesuatu seperti ini
sumber
Gunakan persimpangan dua array.
Ex:
=> ['a', 'b', 'e']
jika 'z dan' s 'di luar jangkauan array pertama, tambahkan di akhir hasil
sumber
Anda dapat melakukan sesuatu seperti ini:
Anda dapat mengujinya di sini .
Catatan: ini mengasumsikan array yang Anda berikan berukuran sama, Anda perlu menambahkan beberapa pemeriksaan tambahan jika ini tidak terjadi.
lihat tautan
lihat
sumber