optimized uniqueItems

master
Evgeny Poberezkin 2015-06-02 00:14:38 +01:00
parent e7c3cb39aa
commit 3d58b95f56
3 changed files with 25 additions and 49 deletions

View File

@ -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;
}

View File

@ -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{{?}}
});
}

View File

@ -1,6 +1,6 @@
{
"name": "ajv",
"version": "0.1.10",
"version": "0.1.11",
"description": "Another JSON schema Validator",
"main": "lib/ajv.js",
"scripts": {