diff options
Diffstat (limited to 'node_modules/ajv/lib/dot/uniqueItems.jst')
-rw-r--r-- | node_modules/ajv/lib/dot/uniqueItems.jst | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/node_modules/ajv/lib/dot/uniqueItems.jst b/node_modules/ajv/lib/dot/uniqueItems.jst index dfc42b03b..22f82f99d 100644 --- a/node_modules/ajv/lib/dot/uniqueItems.jst +++ b/node_modules/ajv/lib/dot/uniqueItems.jst @@ -14,18 +14,42 @@ else { {{?}} - var {{=$valid}} = true; - if ({{=$data}}.length > 1) { - var i = {{=$data}}.length, j; - outer: - for (;i--;) { - for (j = i; j--;) { - if (equal({{=$data}}[i], {{=$data}}[j])) { + var i = {{=$data}}.length + , {{=$valid}} = true + , j; + if (i > 1) { + {{ + var $itemType = it.schema.items && it.schema.items.type + , $typeIsArray = Array.isArray($itemType); + }} + {{? !$itemType || $itemType == 'object' || $itemType == 'array' || + ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0)) }} + outer: + for (;i--;) { + for (j = i; j--;) { + if (equal({{=$data}}[i], {{=$data}}[j])) { + {{=$valid}} = false; + break outer; + } + } + } + {{??}} + var itemIndices = {}, item; + for (;i--;) { + var item = {{=$data}}[i]; + {{ var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); }} + if ({{= it.util[$method]($itemType, 'item', true) }}) continue; + {{? $typeIsArray}} + if (typeof item == 'string') item = '"' + item; + {{?}} + if (typeof itemIndices[item] == 'number') { {{=$valid}} = false; - break outer; + j = itemIndices[item]; + break; } + itemIndices[item] = i; } - } + {{?}} } {{? $isData }} } {{?}} |