Opsi 1 (dengan "kamus"): Anda dapat menggunakan Object
konstruktor sebagai SchemaType untuk menggunakan objek alih-alih array objek. Berikut adalah contoh yang berlaku untuk situasi Anda menggunakan SchemaType#validate
:
offersInCategory: {
type: Object,
validate: object => { //our custom validator, object is the provided object
let allowedKeys = ['Furniture', 'Household', 'Electronicts', 'Other'];
let correctKeys = Object.keys(object).every(key => allowedKeys.includes(key)); //make sure all keys are inside `allowedKeys`
let min = 5;
let max = 10;
let correctValues = Object.values(object).every(value => value > min && value < max); //make sure all values are in correct range
return correctKeys && correctValues; //return true if keys and values pass validation
}
}
Ini tidak berlaku untuk pemeriksaan kunci duplikat karena suatu objek tidak dapat memiliki kunci duplikat , kunci terakhir yang ada hanya menggantikan kunci sebelumnya:
> let foo = { bar: 4, bar: 5}
< Object { bar: 5 }
Seperti yang Anda lihat, bar: 4
kunci yang ditetapkan sebelumnya ditimpa oleh kunci berikutnya.
Opsi 2 (dengan larik): Anda dapat menggunakan SchemaType#validate
untuk menerapkan validasi khusus Anda pada jalur dokumen tertentu. Berikut ini contoh yang Anda inginkan:
offersInCategory: [{
validate: {
validator: array => { //our custom validator, array is the provided array to be validated
let filtered = array.filter((obj, index, self) => self.findIndex(el => el.category === obj.category) === index); //this removes any duplicates based on object key
return array.length === filtered.length; //returns true if the lengths are the same; if the lengths aren't the same that means there was a duplicate key and validation fails
},
message: 'Detected duplicate keys in {VALUE}!'
}
category: {
type: String,
enum: ['Furniture', 'Household', 'Electronicts', 'Other'] //category must be in this enum
},
val: {
type: Number,
min: 0, //minimum allowed number is 0
max: 10 //maximum allowed number is 10
}
}]
Dan jika Anda menguji ini, itu akan menyingkirkan objek dalam array dengan kunci duplikat (menjaga yang sebelumnya) dan memeriksa untuk melihat apakah array hanya menampung objek dengan category
unik kunci.