Saya memiliki array objek yang terlihat seperti ini:
var array = [
{id:123, value:"value1", name:"Name1"},
{id:124, value:"value2", name:"Name1"},
{id:125, value:"value3", name:"Name2"},
{id:126, value:"value4", name:"Name2"}
...
];
Seperti yang Anda lihat, beberapa nama diulang. Saya ingin mendapatkan array baru dengan nama saja, tetapi jika beberapa nama berulang, saya tidak ingin menambahkannya lagi. Saya ingin array ini:
var newArray = ["Name1", "Name2"];
Saya mencoba melakukan ini dengan map
:
var newArray = array.map((a) => {
return a.name;
});
Tetapi masalahnya adalah ini mengembalikan:
newArray = ["Name1", "Name1", "Name2", "Name2"];
Bagaimana saya bisa mengatur beberapa kondisi di dalam map
, sehingga tidak akan mengembalikan elemen yang sudah ada? Saya ingin melakukan ini dengan map
atau beberapa fitur ECMAScript 5 atau ECMAScript 6 lainnya.
javascript
arrays
snoopy25
sumber
sumber
Set
? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Jawaban:
Dengan ES6, Anda dapat menggunakan
Set
nilai unik, setelah memetakan hanya nama objek.Proposal ini menggunakan sintaks menyebar
...
untuk mengumpulkan item dalam larik baru.sumber
...
dilakukan?...
untuk membangun array dengan objek yang dapat berulang.Array.from
menyampaikan maksud konversi jauh lebih baik (dan juga lebih mudah untuk memahami / mencari pemula), sintaks menyebar harus digunakan hanya di mana elemen tersebar adalah salah satu dari banyak. Mungkin menyebutnya sebagai "praktik buruk" agak terlalu kasar, maaf, saya hanya berharap untuk mencegahnya menjadi idiom umum.Jika Anda mencari solusi JavaScript yang tidak ES 6 (tidak ada Set) Anda dapat menggunakan Array ini
reduce
metode :sumber
var names = array.reduce(function(a, b) { a.indexOf(b.name) === -1 && a.push(b.name) return a; }, []);
Secara pribadi saya tidak mengerti mengapa semua orang menyukai ES 6. Jika itu adalah kode saya, saya lebih suka mendukung browser sebanyak mungkin.
sumber
indexOf
-ing sepanjang waktu? Misalnya lakukanadded[name] = true
danif(added[name])
bukannyaif(a.indexOf(name))
.goto fail
, membocorkan variabel indeks Anda ke dalam lingkup pelingkup, dll. ES6 dikodifikasikan ke dalam standar untuk alasan yang baik, dan untuk yang paling banyak bagian sepele mudah untuk polyfill / transformasi untuk browser lama.Anda juga bisa menggabungkan
map
denganfilter
sumber
Anda bisa menggunakan Object.keys () untuk mendapatkan array nama properti enumerable objek tertentu dari hasil objek
array
variabel iterasi dengan Array.prototype.reduce () di mana kuncinya adalah nama yang dirusakKode:
sumber
Banyak jawaban bagus di sini. Saya hanya ingin berkontribusi dengan beberapa keragaman dengan harapan memberi Anda perspektif lain.
Array adalah tipe objek dalam JavaScript, sehingga bisa digunakan sebagai hash pada saat yang bersamaan. Dengan menggunakan fungsionalitas ini kita dapat sangat menyederhanakan pekerjaan yang akan dilakukan dalam satu operasi pengurangan dengan kompleksitas waktu O (n).
Jika Anda tidak senang dengan array Anda yang memiliki beberapa properti selain kunci array Anda mungkin mempertimbangkan untuk menyimpan objek hash yang terpisah juga.
sumber
p[c.name]
hal - hal tersebut pada objek terpisaho
dan kemudian membuangnya setelah itu.Saya setuju bahwa jika Anda hanya membutuhkan
name
nilai, aSet
adalah jalan yang harus ditempuh.Namun , jika Anda ingin mendapatkan larik objek unik berdasarkan
name
properti, saya sarankan untuk menggunakan fileMap
. Cara cepat untuk membuat Peta, adalah melalui array[key, value]
array:Manfaat tambahannya
Map
adalah Anda mendapatkanfilter
fungsionalitas yang menghilangkan non-unik, tanpa kehilangan koneksi dengan objek sumber. Tentu saja, ini hanya diperlukan jika Anda perlu mereferensikan kumpulan objek unik beberapa kali.sumber
Jika Anda terbatas pada ES5, saya akan menggunakan Lodash
_.uniq
sumber
Dengan ES6 ini harus melakukan pekerjaan itu.
sumber
map
seharusnya digunakan dengan fungsi murni, bukan untuk memiliki efek samping. Ini akan menjadi pekerjaan untukforEach
ataureduce
.Menggunakan UnderscoreJS,
`
sumber
Di ES5, gunakan objek sebagai kamus untuk kinerja O ( n ).
Ini hanya akan berfungsi jika semua kuncinya adalah String.
Anda dapat melakukan hal yang sama dalam satu ekspresi jika Anda suka:
tetapi saya merasa bentuk imperatifnya lebih mudah dibaca.
sumber
function (item) { return item.name; }
Object.keys()
, jawaban ini hanya digunakanfilter()
untuk menyimpan nama-nama yang belum disimpan di peta, yang cukup elegan.Coba ini:
sumber
Gunakan
array#forEach()
danarray#indexOf()
metode seperti ini jika Anda ingin kompatibilitas maksimum , sintaks singkat:Namun, jika kompatibilitas adalah bukan masalah penggunaan ECMAScript 6 's
Set
objek,array#map
danArray.from()
metode seperti ini:sumber
Begitulah cara saya melakukannya, menggunakan array kosong yang terpisah.
sumber
Bagi mereka yang mencari 1 liner
atau tanpa menggunakan metode pada prototipe larik
bisa berguna untuk menulis beberapa fungsi murni untuk menangani ini
sumber
sumber