optimized uniqueItems
parent
e7c3cb39aa
commit
3d58b95f56
|
@ -2,22 +2,21 @@
|
|||
|
||||
module.exports = function equal(a, b) {
|
||||
if (a === b) return true;
|
||||
if (typeof a != typeof b) return false;
|
||||
var typeA = Object.prototype.toString.call(a).slice(8, -1);
|
||||
if (typeA != Object.prototype.toString.call(b).slice(8, -1)) return false;
|
||||
switch (typeA) {
|
||||
case 'Object':
|
||||
if (Object.keys(a).length != Object.keys(b).length) return false;
|
||||
for (var key in a) if (!b.hasOwnProperty(key)) return false;
|
||||
for (var key in a) if (!equal(a[key], b[key])) return false;
|
||||
return true;
|
||||
case 'Array':
|
||||
if (a.length != b.length) return false;
|
||||
for (var i=0; i<a.length; i++)
|
||||
if (!equal(a[i], b[i])) return false;
|
||||
return true;
|
||||
case 'Date': return a.getTime() == b.getTime();
|
||||
case 'RegExp': return a.toString() == b.toString();
|
||||
default: return false;
|
||||
|
||||
if (Array.isArray(a) && Array.isArray(b)) {
|
||||
if (a.length != b.length) return false;
|
||||
for (var i = 0; i < a.length; i++)
|
||||
if (!equal(a[i], b[i])) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (a && b && typeof a == 'object' && typeof b == 'object') {
|
||||
var keys = Object.keys(a);
|
||||
if (!equal(keys, Object.keys(b))) return false;
|
||||
for (var i = 0; i < keys.length; i++)
|
||||
if (!equal(a[keys[i]], b[keys[i]])) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1,38 +1,15 @@
|
|||
{{## def.checkUnique:
|
||||
if (unique_itemsHash[item]) {
|
||||
valid = false;
|
||||
break outer;
|
||||
}
|
||||
unique_itemsHash[item] = true;
|
||||
#}}
|
||||
|
||||
var valid = true;
|
||||
|
||||
{{? it.schema.uniqueItems && it.opts.uniqueItems !== false }}
|
||||
if (data.length > 1) {
|
||||
var unique_itemsHash = {};
|
||||
|
||||
var i = data.length, j;
|
||||
outer:
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var item = data[i];
|
||||
switch (typeof item) {
|
||||
case 'object':
|
||||
if (item === null) {
|
||||
{{# def.checkUnique }}
|
||||
} else {
|
||||
for (var j = i+1; j < data.length; j++) {
|
||||
if (equal(item, data[j])) {
|
||||
valid = false;
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'string':
|
||||
item = '"' + item;
|
||||
/* fall through */
|
||||
default:
|
||||
{{# def.checkUnique }}
|
||||
for (;i--;) {
|
||||
for (j = i; j--;) {
|
||||
if (equal(data[i], data[j])) {
|
||||
valid = false;
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -40,7 +17,7 @@ var valid = true;
|
|||
validate.errors.push({
|
||||
keyword: 'uniqueItems',
|
||||
dataPath: dataPath,
|
||||
message: 'item #' + i + 'is duplicate'
|
||||
message: 'items ## ' + i + ' and ' + j + ' are duplicate'
|
||||
{{? it.opts.verbose }}, schema: {{= it.schema.uniqueItems }}, data: data{{?}}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "ajv",
|
||||
"version": "0.1.10",
|
||||
"version": "0.1.11",
|
||||
"description": "Another JSON schema Validator",
|
||||
"main": "lib/ajv.js",
|
||||
"scripts": {
|
||||
|
|
Loading…
Reference in New Issue