Adakah yang tahu cara (ganti jika mungkin juga) untuk mengelompokkan berbagai objek dengan kunci objek lalu membuat array objek baru berdasarkan pengelompokan? Sebagai contoh, saya memiliki berbagai objek mobil:
var cars = [
{
'make': 'audi',
'model': 'r8',
'year': '2012'
}, {
'make': 'audi',
'model': 'rs5',
'year': '2013'
}, {
'make': 'ford',
'model': 'mustang',
'year': '2012'
}, {
'make': 'ford',
'model': 'fusion',
'year': '2015'
}, {
'make': 'kia',
'model': 'optima',
'year': '2012'
},
];
Saya ingin membuat array baru objek mobil yang dikelompokkan berdasarkan make
:
var cars = {
'audi': [
{
'model': 'r8',
'year': '2012'
}, {
'model': 'rs5',
'year': '2013'
},
],
'ford': [
{
'model': 'mustang',
'year': '2012'
}, {
'model': 'fusion',
'year': '2015'
}
],
'kia': [
{
'model': 'optima',
'year': '2012'
}
]
}
groupBy
?Jawaban:
Jawaban Timo adalah bagaimana saya akan melakukannya. Sederhana
_.groupBy
, dan memungkinkan beberapa duplikasi pada objek dalam struktur yang dikelompokkan.Namun OP juga meminta
make
kunci duplikat untuk dihapus. Jika Anda ingin pergi jauh-jauh:Hasil:
Jika Anda ingin melakukan ini menggunakan Underscore.js, perhatikan bahwa versinya
_.mapValues
dipanggil_.mapObject
.sumber
Dalam Javascript biasa, Anda bisa menggunakan
Array#reduce
dengan objeksumber
result
hasil?Object.entries
dan loop melalui pasangan kunci / nilai.make
kumpulan data yang pernah dikelompokkan? Butuh ruang ekstra.Anda sedang mencari
_.groupBy()
.Menghapus properti yang Anda kelompokkan dari objek harus sepele jika diperlukan:
Sebagai bonus, Anda mendapatkan sintaks yang lebih bagus dengan fungsi panah ES6:
sumber
var grouped = _.groupBy(cars, 'make');
Tidak perlu fungsi sama sekali, jika accessor adalah nama properti yang sederhana.Versi singkat untuk mengelompokkan berbagai objek dengan kunci tertentu di es6:
Versi yang lebih panjang:
Tampaknya pertanyaan awal menanyakan bagaimana mengelompokkan mobil berdasarkan merek, tetapi mengabaikan merek di setiap grup. Jadi jawabannya akan terlihat seperti ini:
sumber
Ini adalah
groupBy
fungsi Anda sendiri yang merupakan generalisasi kode dari: https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscoresumber
sumber
Saya akan pergi
REAL GROUP BY
untuk contoh JS Arrays persis sama dengan tugas ini di sinisumber
Anda dapat mencoba untuk memodifikasi objek di dalam fungsi yang disebut per iteration oleh _.groupFungsi. Perhatikan bahwa array sumber mengubah elemennya!
sumber
make
properti, dan itu lebih mudah dibaca.Ini juga dimungkinkan dengan
for
loop sederhana :sumber
for ( let { TABLE_NAME, ...fields } of source) { result[TABLE_NAME] = result[TABLE_NAME] || []; result[TABLE_NAME].push({ ...fields }); }
Untuk kasus di mana kunci dapat menjadi nol dan kami ingin mengelompokkannya sebagai yang lain
sumber
Buat metode yang dapat digunakan kembali
Kemudian di bawah ini Anda dapat mengelompokkan berdasarkan kriteria apa pun
sumber
Versi prototipe menggunakan ES6 juga. Pada dasarnya ini menggunakan fungsi pengurangan untuk meneruskan akumulator dan item saat ini, yang kemudian menggunakan ini untuk membangun array "dikelompokkan" Anda berdasarkan kunci yang dilewatkan. bagian dalam dari pengurangan mungkin terlihat rumit tetapi pada dasarnya ini adalah pengujian untuk melihat apakah kunci dari objek yang dilewatkan ada dan jika kemudian tidak membuat array kosong dan menambahkan item saat ini ke array yang baru dibuat jika tidak menggunakan spread Operator melewatkan semua objek dari array kunci saat ini dan menambahkan item saat ini. Semoga ini bisa membantu seseorang !.
sumber
Anda juga dapat menggunakan
array#forEach()
metode seperti ini:sumber
sumber
Coba saja ini berfungsi baik untuk saya.
let grouped = _.groupBy(cars, 'make');
sumber
Saya membuat tolok ukur untuk menguji kinerja setiap solusi yang tidak menggunakan perpustakaan eksternal.
JSBen.ch
The
reduce()
pilihan, diposting oleh @Nina Scholz tampaknya menjadi salah satu yang optimal.sumber
Saya suka jawaban @metakunfu, tetapi tidak memberikan hasil yang diharapkan. Berikut ini adalah pembaruan yang menyingkirkan "make" di payload JSON akhir.
Keluaran:
sumber
Dengan lodash / fp Anda dapat membuat fungsi dengan
_.flow()
grup pertama itu dengan kunci, lalu memetakan setiap grup, dan menghapus kunci dari setiap item:sumber
Membangun jawaban dengan @Jonas_Wilms jika Anda tidak ingin mengetikkan semua bidang Anda:
Saya tidak membuat tolok ukur apa pun tetapi saya percaya menggunakan for for akan lebih efisien daripada apa pun yang disarankan dalam jawaban ini juga.
sumber
sumber
Array Objek yang Dikelompokkan dalam naskah dengan ini:
sumber
Saya suka menulisnya tanpa ketergantungan / kompleksitas js sederhana murni.
sumber
Ini solusi lain untuk itu. Seperti yang diminta.
Keluaran:
sumber
Ini adalah solusi yang terinspirasi dari Collectors.groupingBy () di Jawa:
Ini akan memberikan objek Peta.
sumber