forked from s-yadav/jsonQ
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjsonQ.min.js
9 lines (8 loc) · 11.3 KB
/
jsonQ.min.js
1
2
3
4
5
6
7
8
9
/*
*jsonQ.js v 1.1.0
*Author: Sudhanshu Yadav
*s-yadav.github.com
*Copyright (c) 2013 -2016 Sudhanshu Yadav.
*MIT licenses
*/
!function(a){var b=Function("return this")()||(0,eval)("this");"function"==typeof define&&define.amd?define(["jsonq"],function(c){return b.jsonQ=a()}):"object"==typeof module&&module.exports?module.exports=a():b.jsonQ=a()}(function(undefined){function matchPath(a,b){var c=new RegExp("^"+a.join("~~"),"i");return c.test(b.join("~~"))}function newFormat(a){var b=a.keyAdded||[],c=a.json,d=a.path,e=a.newJson;return jsonQ.each(c,function(a,f){var g=d?JSON.parse(JSON.stringify(d)):[];g.push(a),"object"==objType(c)&&(b.indexOf(a)==-1&&(b.push(a),e.jsonQ_path[a]=[]),e.jsonQ_path[a].push({path:g}));var h=objType(f);"object"!=h&&"array"!=h||newFormat({json:f,newJson:e,path:g,keyAdded:b})}),e}var jsonQ=function(a){return new jsonQ.fn.init(a)},error=function(a){throw a},stringify=JSON.stringify,parse=JSON.parse;jsonQ.settings={sort:{order:"ASC",logic:function(a){return a},caseIgnore:!0,allLevel:!0}};var tFunc={topLevel:function(a){for(var b=this.jsonQ_current,c=this.cloneObj(jsonQ()),d=c.jsonQ_current=[],e="",f=a.key,g=a.method,h=0,i=b.length;h<i;h++){var k,j=b[h].path,l=!1,m=j.concat([]);if("parent"==g)0===m.length?l=!0:m.pop();else{var n=m.lastIndexOf(f);n==-1?l=!0:m=m.slice(0,n+1)}k=JSON.stringify(m),e==k||l||d.push({path:m}),e=k}return c.length=d.length,c.selector.push({method:g,key:f}),c},qualTrv:function(a){for(var b=this.jsonQ_current,c=this.cloneObj(jsonQ()),d=c.jsonQ_current=[],e=this.jsonQ_path,f=a.key,g=jsonQ.clone(e[f])||[],h=a.qualifier,i=objType(h),j=a.method,k="find"==j,l=0,m=b.length;l<m;l++){var n=b[l].path,o=[],p=!1;if(!k){if(0===n.length)continue;o=n.concat([]),o.pop()}for(var q=0;q<g.length;q++){var s,r=g[q].path;if(k)s=matchPath(n,r);else{var t=r.concat([]);t.pop(),s=o.join()==t.join()}if(s){var u=tFunc.qTest.call(this,i,h,r,d);u&&(g.splice(q,1),q--),p=!0}else if(p)break}}return"string"==i&&(c=this.filter.call(c,h)),c.length=c.jsonQ_current.length,c.selector.push({method:j,key:f,qualifier:h}),c},qTest:function(a,b,c,d){var e="function"==a?b.call(this.pathValue(c)):"object"!=a||jsonQ.checkKeyValue(this.pathValue(c),b);return e&&d.push({path:c}),e}},sortFunc={baseConv:function(a,b,c){if("string"==a){if(c.caseIgnore)return b.toLowerCase()}else{if("array"==a)return b.join();if("object"==a)return stringify(jsonQ.order(b))}return b},sortAry:function(a,b,c){return a.sort(function(a,c){var d=b(a),e=b(c);return d<e?-1:d>e?1:0}),"desc"==c.order.toLowerCase()&&a.reverse(),a}};jsonQ.fn=jsonQ.prototype={init:function(a){var b;if(!a)return this;if(b=objType(a),"string"==b)try{a=JSON.parse(a)}catch(a){error("Not a valid json string.")}else if("object"!=b&&"array"!=b)return error("Not a valid json object."),a;return this.jsonQ_root=a,this.jsonQ_path={},this.jsonQ_current=[{path:[]}],newFormat({json:a,newJson:this,refresh:!0}),this.length=this.jsonQ_current.length,this.selector=[],this},pathValue:function(a){return jsonQ.pathValue(this.jsonQ_root,a)},setPathValue:function(a,b){return jsonQ.setPathValue(this.jsonQ_root,a,b),this},clone:function(){return parse(stringify(this.jsonQ_current))},cloneObj:function(a){var b=this;return a=a||{},jsonQ.each(b,function(b,c){a[b]=c}),a.selector=jsonQ.merge([],a.selector),a},value:function(a,b){var c=this.jsonQ_current;if(b=b!==!1,a){for(var e=objType(a),f=0,g=c.length;f<g;f++){var i,h=c[f].path;if("function"==e){var j=this.pathValue(h);i=b?jsonQ.clone(a(j)):a(j)}else i=b?jsonQ.clone(a):a;this.setPathValue(h,i)}return this}var d=[];return this.each(function(a,b,c){d.push(c)}),d},append:function(a,b){return this.appendAt("last",a,b)},prepend:function(a,b){return this.appendAt("first",a,b)},appendAt:function(a,b,c){var d=this.jsonQ_current;if(isNaN(a)&&"first"!=a&&"last"!=a)return error(a+"is not a valid index."),this;for(var e=0,f=d.length;e<f;e++){var g=d[e].path.concat([]),h=g.pop(),i=this.pathValue(g),j=objType(i[h]),k=i[h].length,l=a<0||"first"==a?0:a>k||"last"==a?k:a;if("array"==j)b=c?jsonQ.clone(b):b,i[h].splice(l,0,b);else if("string"==j){var m=i[h];i[h]=m.substring(0,l)+b+m.substring(l,k)}}return this},filter:function(a){var b=this.jsonQ_current,c=this.cloneObj(jsonQ()),d=c.jsonQ_current=[],e=objType(a);if(!a)return this;for(var f=0,g=b.length;f<g;f++){var h=b[f].path;tFunc.qTest.call(this,e,a,h,d)}if("string"==e){var i=/(nth|eq)\((.+)\)/,j=i.exec(a);d=j?jsonQ.nthElm(b,j[2],!0):jsonQ.nthElm(b,a,!0),c.jsonQ_current=d}return c.length=d.length,c.selector.push({method:"filter",qualifier:a}),c},find:function(a,b){return tFunc.qualTrv.call(this,{method:"find",key:a,qualifier:b})},sibling:function(a,b){return tFunc.qualTrv.call(this,{method:"sibling",key:a,qualifier:b})},parent:function(){return tFunc.topLevel.call(this,{method:"parent"})},closest:function(a){return tFunc.topLevel.call(this,{method:"closest",key:a})},path:function(){return this.jsonQ_current[0].path},firstElm:function(){return this.pathValue(this.jsonQ_current[0].path)},lastElm:function(){return this.pathValue(this.jsonQ_current[this.length-1].path)},nthElm:function(a,b){return jsonQ.nthElm(this.value(),a,b)},index:function(a,b){return jsonQ.index(this.value(),a,b)},createXML:function(){return jsonQ.createXML(this.value())},sort:function(a,b){b=jsonQ.merge({},jsonQ.settings.sort,b);var f,g,c=this.find(a),d=c.clone(),e=[],h=[],i=objType(c.pathValue(d[0].path)),j=function(a){for(;0!==a.length;){var b=a.pop();if(!isNaN(b)){var d=c.pathValue(a);if("array"==objType(d))return d}}return null};for(f=0,g=d.length;f<g;f++)e.push({pathHolder:d[f].path.concat([]),current:d[f].path.concat([])});for(var k=0,l=function(a){return e.splice(a,1),--a};0!==e.length;)for(k++,f=0;f<e.length;f++){var m=e[f].current,n=e[f].pathHolder,o=j(m),p=m.join();if(0===m.length||h.indexOf(p)!=-1)f=l(f);else{var q=n.slice(m.length+1,n.length),r=function(a){var c=jsonQ.pathValue(a,q);return c=sortFunc.baseConv(i,c,b),b.logic(c)};sortFunc.sortAry(o,r,b),b.allLevel?(n[m.length]=0,h.push(p)):f=l(f)}}return jsonQ(c.jsonQ_root).find(a)},each:function(a){for(var b=this.jsonQ_current,c=0,d=b.length;c<d;c++)a(c,b[c].path,this.pathValue(b[c].path));return this},unique:function(){return jsonQ.unique(this.value())},refresh:function(){for(var a=this.selector,b=jsonQ(this.jsonQ_root),c=0,d=a.length;c<d;c++){var e=a[c],f=[];e.key&&f.push(e.key),e.qualifier&&f.push(e.qualifier),b=b[e.method].apply(b,f)}return this.cloneObj.call(b,this),this},prettify:function(a){return jsonQ.prettify(this.value(),a)}},jsonQ.each=function(a,b){for(var c in a)a.hasOwnProperty(c)&&b(c,a[c])};var objType=jsonQ.objType=function(){var a={"[object Array]":"array","[object Object]":"object","[object String]":"string","[object Number]":"number","[object Boolean]":"boolean","[object Null]":"null","[object Function]":"function"};return function(b){var c=Object.prototype.toString.call(b);return a[c]}}();return jsonQ.merge=function(){var a=arguments,b=objType(a[0]),c=1,d=a.length,e=!1,f=a[0];if(0!==d&&("boolean"!=b||1!=d)){"boolean"==b&&(f=a[1],c=2,e=a[0]);for(var g=function(a,b){var c=objType(b),d=objType(f[a]);!e||"array"!=c&&"object"!=c?f[a]=b:(f[a]=c!=d||"array"!=d&&"object"!=d?"array"==c?[]:{}:f[a],jsonQ.merge(e,f[a],b))};c<d;c++)jsonQ.each(a[c],g);return f}},jsonQ.merge(jsonQ,{sort:function(a,b){if(b=jsonQ.merge({},jsonQ.settings.sort,b),"array"!=objType(a))return void error("Only array is allowed to sort");var c=function(a){var c=objType(a);return a=sortFunc.baseConv(c,a,b),b.logic(a)};return sortFunc.sortAry(a,c,b)},order:function(a){if("object"!=typeof a)return a;var b=function(a){return isNaN(a)||(a=parseInt(a)),a},c=function(a){var d=objType(a),e=Object.keys(a);"object"==d&&e.sort(function(a,c){var d=b(a),e=b(c);return d<e?-1:d>e?1:0});for(var f=0,g=e.length;f<g;f++){var h=e[f],i=a[h],j=objType(i);"object"!=j&&"array"!=j||c(i),"object"==d&&(delete a[h],a[h]=i)}};return c(a),a},clone:function(a){var b=objType(a);return"object"==b||"array"==b?parse(stringify(a)):a},index:function(a,b,c){var d=objType(b),e=a.length,f="object"==d||"array"==d||"function"==d;if("function"==d&&(c=!0),f&&!c)var g=stringify(jsonQ.order(b));for(var h=0;h<e;h++){var i=a[h];if(f){var j=objType(i);if(j!=d&&!c)continue;if(c){var k;if("function"==d)k=b.call(i);else if("object"==d&&"object"==j)k=jsonQ.checkKeyValue(i,b);else if("array"==j)if("array"==d)for(var l=0,m=b.length;l<m&&(k=jsonQ.index(i,b[l])!=-1,k);l++);else k=jsonQ.index(i,b)!=-1;if(k)return h}else if(stringify(jsonQ.order(i))==g)return h}else if(b==i)return h}return-1},contains:function(a,b,c){return jsonQ.index(a,b,c)!=-1},checkKeyValue:function(a,b){for(var c in b)if(b.hasOwnProperty(c)&&!jsonQ.identical(b[c],a[c]))return!1;return!0},nthElm:function(array,arg,aryRetrn){var result;if(array[arg])result=array[arg];else if("last"==arg)result=array[array.length-1];else if("first"==arg)result=array[0];else if("random"==arg){var rand=Math.floor(Math.random()*array.length);result=array[rand]}else if("even"==arg)result=jsonQ.nthElm(array,"2n");else if("odd"==arg)result=jsonQ.nthElm(array,"2n+1");else try{var newArray=[],ln=array.length;if(!arg.match(/^[0-9n*+-\/]+$/))throw"";arg=arg.replace(/([0-9])n/g,function(a,b){return b?b+"*n":a});for(var n=0;n<ln;n++){var index=eval(arg);if(index>ln-1)break;newArray.push(array[index])}result=newArray}catch(a){result=array}return result=result||array,"array"!=objType(result)&&aryRetrn?[result]:result},prettify:function(a,b){if("object"!=typeof a)throw"Only valid json object is allowed.";return b?JSON.stringify(a,null,"\t").replace(/\n/g,"</br>").replace(/\t/g," "):JSON.stringify(a,null,3)},identical:function(a,b){function c(a){return"object"!=typeof a||null===a?a:Object.keys(a).sort().map(function(b){return{key:b,value:c(a[b])}})}return JSON.stringify(c(a))===JSON.stringify(c(b))},union:function(){for(var a=arguments,b=[],c=a.length,d=0;d<c;d++)for(var e=a[d].length,f=0;f<e;f++){var g=a[d][f];jsonQ.index(b,g)==-1&&b.push(g)}return b},intersection:function(){var c,a=arguments,b=[],d=a.length;if(1==d)b=a[0];else for(var e=0,f=a[0].length;e<f;e++){var g=a[0][e];c=1;for(var h=1;h<d;h++)if(jsonQ.index(a[h],g)==-1){c=0;break}1==c&&b.push(g)}return b},suffle:function(a){for(var b=1,c=a.length;b<c;b++){var d=Math.floor(Math.random()*(b+1)),e=a[b];a[b]=a[d],a[d]=e}return a},unique:function(a){for(var b=a.length,c=[],d=0;d<b;d++)jsonQ.index(c,a[d])==-1&&c.push(a[d]);return c},pathValue:function(a,b){var c=0,d=b.length;if(null===a)return null;for(;c<d;){if(null===a[b[c]])return void(a=null);a=a[b[c]],c+=1}return a},setPathValue:function(a,b,c){var d=0,e=a,f=b.length;if(null===a)return null;for(;d<f;)"object"!=typeof e[b[d]]&&(e[b[d]]="number"==objType(b[d+1])?[]:{}),d==b.length-1&&(e[b[d]]=c),e=e[b[d]],d+=1;return a},createXML:function(a){var b=function(a,c){c=c||[];var d=0===c.length,e=objType(a);return d&&c.push('<?xml version="1.0" encoding="ISO-8859-1"?><jsonXML>'),jsonQ.each(a,function(a,d){var f="array"==e?"arrayItem":a,g=objType(d);c.push("<"+f+' type="'+g+'">'),"object"==g||"array"==g?b(d,c):c.push("<![CDATA["+d+"]]>"),c.push("</"+f+">")}),d?(c.push("</jsonXML>"),c.join("")):c};return b(a)},append:function(a,b,c){return jsonQ.appendAt(a,"last",b,c)},prepend:function(a,b,c){return jsonQ.appendAt(a,"first",b,c)},appendAt:function(a,b,c,d){if(isNaN(b)&&"first"!=b&&"last"!=b)return void error(b+"is not a valid index.");var e=objType(a),f=a.length,g=b<0||"first"==b?0:b>f||"last"==b?f:b;return"array"==e?(c=d?jsonQ.clone(c):c,a.splice(g,0,c)):"string"==e&&(a=a.substring(0,g)+c+a.substring(g,f)),a}}),jsonQ.fn.init.prototype=jsonQ.fn,jsonQ});