Saya menjalankan sederhana di ng-repeat
atas file JSON dan ingin mendapatkan nama kategori. Ada sekitar 100 objek, masing-masing milik kategori - tetapi hanya ada sekitar 6 kategori.
Kode saya saat ini adalah:
<select ng-model="orderProp" >
<option ng-repeat="place in places" value="{{place.category}}">{{place.category}}</option>
</select>
Outputnya adalah 100 opsi berbeda, kebanyakan duplikat. Bagaimana cara menggunakan Angular untuk memeriksa apakah {{place.category}}
sudah ada, dan tidak membuat opsi jika sudah ada?
sunting: Di javascript saya $scope.places = JSON data
,, hanya untuk memperjelas
db.collection.distinct("places")
, yang jauh, jauh lebih baik daripada melakukannya di dalam Angular! Sayangnya ini tidak akan bekerja untuk semua orang.Jawaban:
Anda dapat menggunakan filter unik dari AngularUI (kode sumber tersedia di sini: filter unik AngularUI ) dan menggunakannya langsung di opsi-ng (atau ng-repeat).
sumber
angular.module('yourModule', ['ui', 'ui.filters']);
. Bingung sampai saya melihat di dalam file js AngularUI.unique
Filter saat ini dapat ditemukan sebagai bagian dari AngularJs UI Utilsangular.module('ui.filters')
ke nama aplikasi Anda.Atau Anda dapat menulis filter sendiri menggunakan lodash.
sumber
_.uniqBy(arr, field);
harus bekerja untuk properti bersarangAnda dapat menggunakan filter 'unik' (alias: uniq) dalam modul angular.filter
penggunaan:
colection | uniq: 'property'
Anda juga dapat memfilter menurut properti bersarang:
colection | uniq: 'property.nested_property'
Apa yang dapat Anda lakukan, adalah sesuatu seperti itu ..
HTML: Kami memfilter menurut id pelanggan, yaitu menghapus pelanggan duplikat
daftar hasil Pelanggan:
foo 10
bar 20
baz 30
sumber
kode ini berfungsi untuk saya.
lalu
sumber
Jika Anda ingin mendaftar kategori, saya pikir Anda harus secara eksplisit menyatakan niat Anda dalam tampilan.
di controller:
sumber
group by
ekspresi dalamselect
arahan.Berikut adalah contoh sederhana dan generik.
Filter:
Markup:
sumber
Cannot read property 'length' of undefined
di barisl = arr.length
Saya memutuskan untuk memperluas jawaban @ thethakuri untuk memungkinkan kedalaman bagi anggota unik. Ini kodenya. Ini untuk mereka yang tidak ingin menyertakan seluruh modul AngularUI hanya untuk fungsi ini. Jika Anda sudah menggunakan AngularUI, abaikan jawaban ini:
Contoh
sumber
Saya memiliki serangkaian string, bukan objek dan saya menggunakan pendekatan ini:
dengan filter ini:
sumber
MEMPERBARUI
Saya merekomendasikan penggunaan Set tetapi maaf ini tidak bekerja untuk ng-repeat, atau Map karena ng-repeat hanya bekerja dengan array. Jadi abaikan jawaban ini. Bagaimanapun jika Anda perlu memfilter duplikat satu cara adalah seperti yang dikatakan orang lain menggunakan
angular filters
, berikut adalah tautan untuk itu ke bagian memulai .Jawaban lama
Anda dapat menggunakan struktur Set Data standar ECMAScript 2015 (ES6) , alih-alih Struktur Data Array dengan cara ini Anda memfilter nilai berulang ketika menambahkan ke Set. (Ingat set tidak memungkinkan nilai berulang). Sangat mudah digunakan:
sumber
Inilah cara khusus templat untuk melakukannya (meskipun tidak mempertahankan urutannya). Plus, hasilnya akan dipesan juga, yang berguna dalam kebanyakan kasus:
sumber
Tidak ada filter di atas yang memperbaiki masalah saya jadi saya harus menyalin filter dari doc github resmi . Dan kemudian gunakan seperti yang dijelaskan dalam jawaban di atas
mengembalikan fungsi (item, filterOn) {
sumber
Sepertinya semua orang melemparkan versi
unique
filter mereka sendiri ke dalam ring, jadi saya akan melakukan hal yang sama. Kritik sangat diterima.sumber
Jika Anda ingin mendapatkan data unik berdasarkan kunci bersarang:
Sebut saja seperti ini:
sumber
Tambahkan filter ini:
Perbarui markup Anda:
sumber
Ini mungkin berlebihan, tetapi itu berhasil untuk saya.
Fungsi yang berbeda tergantung pada fungsi berisi yang didefinisikan di atas. Dapat disebut sebagai
array.distinct(prop);
prop adalah properti yang Anda ingin berbeda.Jadi bisa dibilang begitu
$scope.places.distinct("category");
sumber
Buat array Anda sendiri.
sumber