Tùy chọn 1 (với "từ điển"): Bạn có thể sử dụng Object
phương thức khởi tạo như một SchemaType để sử dụng một đối tượng thay vì một mảng đối tượng. Đây là ví dụ áp dụng cho trường hợp của bạn khi sử dụng 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
}
}
Điều này không áp dụng kiểm tra khóa trùng lặp vì một đối tượng không thể có khóa trùng lặp , khóa sau hiện tại chỉ ghi đè khóa trước:
> let foo = { bar: 4, bar: 5}
< Object { bar: 5 }
Như bạn có thể thấy, thanh bar: 4
khóa được gán trước đó sẽ bị khóa sau ghi đè.
Tùy chọn 2 (với mảng): Bạn có thể sử dụng SchemaType#validate
để triển khai xác thực tùy chỉnh của bạn trên một đường dẫn tài liệu nhất định. Đây là một ví dụ về những gì bạn muốn:
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
}
}]
Và nếu bạn kiểm tra điều này, nó sẽ loại bỏ các đối tượng trong mảng có khóa trùng lặp (giữ lại khóa trước đó) và kiểm tra xem liệu mảng có chỉ chứa các đối tượng có category
duy nhất hay không chìa khóa.