begin process at 2012 05 28 15:01:12
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > SYSTÈME DE REQUÊTE SUR DES DONNÉES JSON

SYSTÈME DE REQUÊTE SUR DES DONNÉES JSON


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :json, requête, nosql, query, xpath Niveau :Expert Date de création :04/08/2010 Date de mise à jour :06/08/2010 21:02:12 Vu / téléchargé :3 017 / 117

Auteur : Kimjoa

Ecrire un message privé
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Ce script  permet de faire des sélections via une syntaxe ce rapprochant des sélecteurs css. Mais aussi de tester si un objet valide un sélecteur.
Il n'y a que 9 sélecteurs définit pour le moment, mais permettent déjà de faire pas mal de truc intéressant :

*            : sélectionne tout les éléments définissant l'objet  récursivement  (ses descendants)
>           : sélectionne tout les éléments définissant l'objet (ses enfants)
:where       : qui est une condition à passer pour valider ou pas une sélection
:whereMatch  : qui est une condition définit par une règle à passer pour valider ou pas une sélection
:whereUnique : qui est une condition à passer pour valider ou pas une sélection, et dont la validation interrompra la recherche d'autre occurrence (un peux comme une clé primaire)
:whereMin    : qui définit un minimum
:whereMax    : qui définit un maximum
dutexte      : une propriété spécifique, peux être un chiffre pour un tableaux
[+du texte+] : une propriété spécifique,s'accordant pas à la syntaxe js

la clause :where et :whereMatch, passe par une référence à l'objet en court "object" via le nom de variable "object"

:whereMin et :whereMax  accèpte deux arguments.
le 1er argument de définit la proprité devant satisfaire la condition sous forme d'une règle
le 2er argument est optionnelle , il définit qu'elle fonction , ou classe permet de comparer la valeur à une autre.

par exemple : JSON.select(Articles, "> :whereMax(> date, new Date) > titre"));


exemple d'une requête complexe : Séléction des titres des commentaire de fred des articles de Marion délisse et dont au moins un des commentaires est édité par Joakim

> :where(object.auteur == 'Marion délisse'):whereMatch(object.commentaire, :where(object.auteur == 'Joakim')) commentaire > :where(object.auteur == 'fred') > titre

voir ci-dessous

Source

  • <!DOCTYPE HTML>
  • <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  • <head>
  • <title>JSONSelector</title>
  • <script type="text/javascript">
  • var JSON = window.JSON || {};
  • JSON.each = function(object, fn){
  • if(object.each){
  • object.each(fn);
  • }else if(object.constructor == Object){
  • for(var i in object)
  • fn(object[i], i);
  • }else if(object.constructor == Array){
  • for(var i = 0, l = object.length; i < l; i++)
  • fn(object[i], i);
  • }
  • };
  • (function(){
  • var cache = {select : {}, match : {}};
  • function getLastProperty(resProperty, lastProperty){
  • }
  • function getCondition(rule, si){
  • for(var i = si, l = rule.length, j = 1; i < l; i++){
  • if(rule[i] == '(' && rule[i-1] != '\\'){
  • j++;
  • }else if(rule[i] == ')' && rule[i-1] != '\\')
  • j--;
  • if(!j)
  • return [rule.slice(si, i), rule.slice(i + 1)];
  • }
  • }
  • function addslashes(str) {
  • str = str.replace(/\\/g,'\\\\');
  • str = str.replace(/\'/g,'\\\'');
  • str = str.replace(/\"/g,'\\"');
  • str = str.replace(/\0/g,'\\0');
  • return str;
  • }
  • /*
  • $1 = une descendance direct ou indirect
  • $2 = une descendance direct >
  • $3 = une propriété
  • $4 = une propriété ne s'accordant pas à la syntaxe js [+..+]
  • $5 = la valeur de la proprité $4
  • $6 = clause where ou whereMatch + tout le reste de la règle (parssé récurssivement)
  • $7 = clause whereMatch
  • $8 = les clauses commencant par :
  • */
  • var GROUPE_REG = /((\s*>\s*)|\s*\*\s*)((\[\+([^\+\]]+)\+\])|[\w\d$_]*)|(:where((Match)*(Unique)*(Min)*(Max)*)\(.*)|(:\w+)/g;
  • function query(selector, match, min, max, rest){
  • var closes = [],//objets des fermetures des fonctions
  • lastProperty = 'object',
  • combiProperty = 'object',
  • mm = min || max,
  • minRule, maxRule, currentProperty;
  • var start = (match ? "var valid = {};try{" : mm || rest ? "" : "var res = [];" + (/whereUnique/.test(selector) ? "var unique = {};" : ""));
  • var fn = start +selector.replace(GROUPE_REG, function($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11){
  • if($1){
  • combiProperty = lastProperty;
  • currentProperty = $3 || ($5 ? addslashes($5) : null);
  • if(currentProperty){
  • if($2) lastProperty += "['"+currentProperty+"']";
  • else lastProperty = "object['"+currentProperty+"']";
  • }else lastProperty = 'object';
  • if($2){
  • closes.push(currentProperty ? "}" : "});");
  • return currentProperty ? "if("+combiProperty+".hasOwnProperty('"+currentProperty+"')){" : "JSON.each("+combiProperty+",function(object){";
  • }else{
  • closes.push("JSON.each(object, arguments.callee);})("+combiProperty+");");
  • if(currentProperty)closes.push("}");
  • return "(function(object){"+(currentProperty? "if(object.hasOwnProperty('"+currentProperty+"')){" : "");
  • }
  • }
  • if($6){
  • if($10 || $11){
  • var c = getCondition($6, $7 ? 7 + $7.length : 7);
  • c[0] = c[0].split(/,((\s|\w|\d|_)*)$/gm);
  • if($10) minRule= c; else maxRule = c;
  • return '';
  • }
  • if($9)
  • closes.push("throw unique;}catch(e){}");
  • closes.push('}');
  • var conds = getCondition($6, $7 ? 7 + $7.length : 7);
  • if($8)
  • return "if(JSON.match("+lastProperty+",\""+conds[0]+"\")){" + conds[1].replace(GROUPE_REG, arguments.callee);
  • return ($9 ? "try{" : "") +"if("+(conds[0]).replace("object", lastProperty)+"){" + conds[1].replace(GROUPE_REG, arguments.callee);
  • }
  • })+ (match ? "throw valid;" : mm ?
  • mm[1] ? "var mm = "+mm[1]+"("+lastProperty+");if(!minMax || mm"+(min ? "<" : ">")+"minMax){minMax = mm;_object = __object;}"
  • : "if(!minMax || "+lastProperty+(min ? "<" : ">")+"minMax){minMax = "+lastProperty+";_object = __object;}"
  • : "res.push("+lastProperty+");")+ closes.reverse().join('');
  • if(minRule || maxRule){
  • var m = minRule || maxRule;
  • fn += "var minMax, _object, __object; JSON.each(res, function(object){__object = object;"+query(m[0][0], false, minRule ? minRule[0] : false, maxRule ? maxRule[0]: false)+"});"
  • + (!m[1] ? "res = [_object];" : "object = _object;res = [];if(object){" + query(m[1], false, false, false, true))+"}";
  • }
  • var end = (match ? "}catch(e){if(e == valid)return true;}return false;" : mm || rest? "" : "return res;");
  • if(mm || rest) return fn + end;
  • fn = new Function("object", fn + end);
  • //met en cache
  • cache[match ? "match" : "select"][selector] = fn;
  • //pour voire comment les fonctions sont créer
  • document.getElementById("de").innerHTML += "function du sélécteur : " + selector + "\n" + fn + "\n\n";
  • return fn;
  • }
  • JSON.select = function(object, selector){
  • return (cache.select[selector] || query(selector))(object);
  • }
  • JSON.match = function(object, selector){
  • return (cache.match[selector] || query(selector, true))(object);
  • }
  • })();
  • </script>
  • </head>
  • <body>
  • <!-- pour voire ce que donnes les fonctions;-->
  • <pre id = 'de'></pre>
  • <div id = 'test'></div>
  • </body>
  • <script type="text/javascript">
  • //une JSON simple pour l'exemple.
  • //Un ensemble d'article , ccontenant des commentaire, eux même pouvant contenir des commentaire
  • var Articles = [{
  • titre : 'les abeilles chantent',
  • auteur : 'Marion délisse',
  • date : "10 06 2007",
  • commentaires : [{
  • titre : 'Pas mal!',
  • auteur : 'fred',
  • date : "10 07 2007",
  • contenue : 'du text....',
  • commentaires : [{
  • titre : 'Merci ;)',
  • date : "10 12 2007",
  • auteur : 'Marion délisse',
  • contenue : 'du text....'
  • }]
  • },{
  • titre : 'Bof',
  • auteur : 'jean-jean le blérot',
  • date : "10 08 2007",
  • contenue : 'du text....',
  • commentaires : [{
  • titre : 'Hmm',
  • auteur : 'Marion délisse',
  • date : "10 09 2007",
  • contenue : 'du text....'
  • },{
  • titre : 'N\'importe quoi',
  • date : "10 10 2007",
  • auteur : 'fred',
  • contenue : 'du text....'
  • },{
  • titre : 'L\'écoute pas mon bébé',
  • date : "10 11 2007",
  • auteur : 'Joakim',
  • contenue : 'du text....'
  • }]
  • }]
  • },{
  • titre : 'Jojo le boss !!!!',
  • auteur : 'Joakim',
  • date : "10 06 2008",
  • commentaires : [{
  • titre : 'Comment t\es tros fort',
  • auteur : 'fred',
  • date : "10 07 2008",
  • contenue : 'du text....',
  • commentaires : [{
  • titre : 'Je sais !! ',
  • auteur : 'Joakim',
  • date : "10 08 2008",
  • contenue : 'du text....',
  • commentaires : [{
  • titre : 'Ca va les chevilles ?',
  • date : "10 09 2008",
  • auteur : 'jean-jean le blérot',
  • contenue : 'du text....',
  • }]
  • }, {
  • titre : 'Bisous mon héro',
  • date : "10 10 2008",
  • auteur : 'Marion délisse',
  • contenue : 'du text....'
  • }]
  • }]
  • },{
  • titre : 'les abeilles chantent plus',
  • auteur : 'Marion délisse',
  • date : "10 06 2009",
  • commentaires : [{
  • titre : 'C\'est triste',
  • date : "10 07 2009",
  • auteur : 'fred',
  • contenue : 'du text....',
  • commentaires : [{
  • titre : 'C\'est vrai',
  • date : "10 08 2009",
  • auteur : 'Marion délisse',
  • contenue : 'du text....'
  • }]
  • }]
  • }];
  • //séléctionne les objets Articles.
  • alert("Séléction des objets Articles :"
  • +JSON.select(Articles, ">").length);
  • //explication : on séléctionne l'ensemble des enfants de Articles par le sélécteur de descendance directe >.
  • //exemple pas du tout utile vu qu'il renvoie juste une copie de Articles
  • //Séléction des titre des Articles.
  • alert("Séléction des titre des Articles :"
  • +JSON.select(Articles, "> > titre"));
  • //explication : on recherche pour chaque article de Articles > une propriété titre descandant directement de l'article (deuxième > plus la la prorpiété titre)
  • //les espace entre les > ne sont pas obligatoire
  • //Séléction de l'ensemble des objets possèdant un titres (commentaire compris).
  • alert("Séléction de l'ensemble des objets possèdant un titres (commentaire compris) :"
  • +JSON.select(Articles, "*:where(object.titre)").length);
  • //explication : on ne séléctionne tout les objets *
  • //qui définissent un titre , via la clause where et la référence à l'objet en court "object"
  • //Séléction de l'auteur de l'article les abeilles chantent
  • alert("Séléction de l'auteur de l'article les abeilles chantent :"
  • +JSON.select(Articles, "> :whereUnique(object.titre == 'les abeilles chantent') > auteur"));
  • //explication : on séléctionne l'ensemble des articles de Articles (>)
  • //puis pour chaque article on ne séléctionne que celui qui à comme titre les abeilles chantent via la clause whereUnique et la référence à l'objet en court "object"
  • //whereUnique stop la recherche au premier test positif, il peux servir pour définir des clé primaire
  • //puis on séléctionne la propriété auteur directement descendante (fille) par > auteur
  • //Séléction du titre de le l'article le plus récent
  • alert("Séléction du titre le l'article le plus récent :" +
  • JSON.select(Articles, "> :whereMax(> date, new Date) > titre"));
  • //explication : on séléctionne l'ensemble des articles de Articles (>)
  • //puis on ne séléctionne celui qui la date la plus récente :whereMax(> date, new Date)
  • //le 1er argument de whereMax définit la proprité devant satisfaire la condition sous forme d'une règle
  • //le 2er argument est optionnelle , il définit qu'elle fonction , ou classe permet de comparer la valeur à une autre
  • // ici on transforme une string , en date , mais vous pouvait passer tout sorte d'objet
  • //Séléction du titre le l'article qui comprends le commentaire le plus vieux
  • alert("Séléction du titre le l'article qui comprends le commentaire le plus vieux :" +
  • JSON.select(Articles, "> :whereMin(* commentaires > > date, new Date) > titre"));
  • //explication : on séléctionne l'ensemble des articles de Articles (>)
  • //puis on ne séléctionne celui qui à le commentaire le plus vieux :whereMin(* commentaire > date, new Date)
  • //détail de -> * commentaires > date , on se trouve dans un article, donc on séléctionne tout les tableaux de commentaires possible commentaires (* commentaires)
  • //puis pour chaque commentaire (>) on test la date ( >date)
  • //Séléction des titres des commentaires des articles de Marion délisse et dont au moin un des commentaires est édité par Joakim
  • alert("Séléction des titres des commentaire des articles de Marion délisse et dont au moin un des commentaires est édité par Joakim : "
  • +JSON.select(Articles, "> :where(object.auteur == 'Marion délisse'):whereMatch(* commentaires > :where(object.auteur == 'Joakim')) > titre"));
  • //explication : on séléctionne l'ensemble des articles de Articles (>)
  • //puis pour chaque article on ne séléctionne que celui qui à comme auteur Marion délisse via la clause where et la référence à l'objet en court "object"
  • //de ses commentaire, on test si au moin un commentaire est éditer par joakim
  • //détail de -> whereMatch(* commentaires > :where(object.auteur == 'Joakim'))
  • // * commentaires -> on séléctionne tout les object commentaire descendant
  • // > -> puis pour chaque commentaire
  • // :where(object.auteur == 'Joakim') -> si l'auteur == joakim
  • //le teste passe ....
  • //enfin on ne séléctionn que les titre (> titre)
  • //Séléction des titres des commentaires de fred des articles de Marion délisse et dont au moin un des commentaires est édité par Joakim
  • alert("Séléction des titres des commentaires de fred des articles de Marion délisse et dont au moin un des commentaires est édité par Joakim : " +
  • JSON.select(Articles, "> :where(object.auteur == 'Marion délisse'):whereMatch(* commentaires > :where(object.auteur == 'Joakim')) * commentaires > :where(object.auteur == 'fred') > titre"));
  • //explication : je vous laisse devinner ;)
  • //A vous de bidouiller maintenant :)
  • </script>
<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
    <title>JSONSelector</title>
	<script type="text/javascript">
	

var JSON = window.JSON || {};

JSON.each = function(object, fn){
	if(object.each){
		object.each(fn);
	}else if(object.constructor == Object){
		for(var i in object)
			fn(object[i], i);
	}else if(object.constructor == Array){
		for(var i = 0, l = object.length; i < l; i++)
			fn(object[i], i);
	}
};

(function(){

	var cache = {select : {}, match : {}};
	
	function getLastProperty(resProperty, lastProperty){
	}
	
	function getCondition(rule, si){
		for(var i = si, l = rule.length, j = 1; i < l; i++){
			if(rule[i] == '(' && rule[i-1] != '\\'){
				j++;
			}else if(rule[i] == ')' && rule[i-1] != '\\')
				j--;
			if(!j)
				return [rule.slice(si, i), rule.slice(i + 1)];
		}
	}
	
	function addslashes(str) {
		str = str.replace(/\\/g,'\\\\');
		str = str.replace(/\'/g,'\\\'');
		str = str.replace(/\"/g,'\\"');
		str = str.replace(/\0/g,'\\0');
		return str;
	}

	/*
	 $1 = une descendance direct ou indirect
	 $2 = une descendance direct >	
	 $3 = une propriété	
	 $4 = une propriété ne s'accordant pas à la syntaxe js [+..+]
	 $5 = la valeur de la proprité $4
	 $6 = clause where ou whereMatch + tout le reste de la règle (parssé récurssivement)
	 $7 = clause whereMatch
	 $8 = les clauses commencant par :
	*/
			
	var GROUPE_REG = /((\s*>\s*)|\s*\*\s*)((\[\+([^\+\]]+)\+\])|[\w\d$_]*)|(:where((Match)*(Unique)*(Min)*(Max)*)\(.*)|(:\w+)/g;
	
	
	function query(selector, match, min, max, rest){
		var closes = [],//objets des fermetures des fonctions 
		lastProperty = 'object',
		combiProperty = 'object',
		mm = min || max,
		minRule, maxRule, currentProperty;
		
		var start = (match ? "var valid = {};try{" : mm || rest  ? "" : "var res = [];" + (/whereUnique/.test(selector) ? "var unique = {};" : ""));
		
		var fn = start +selector.replace(GROUPE_REG, function($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11){
			if($1){
				combiProperty = lastProperty;
				currentProperty = $3 || ($5 ? addslashes($5) : null);
				
				if(currentProperty){
					if($2) lastProperty += "['"+currentProperty+"']";
					else lastProperty = "object['"+currentProperty+"']";
				}else lastProperty = 'object';
				
				if($2){
					closes.push(currentProperty  ? "}" : "});");
					return currentProperty ? "if("+combiProperty+".hasOwnProperty('"+currentProperty+"')){" : "JSON.each("+combiProperty+",function(object){";
				}else{
					closes.push("JSON.each(object, arguments.callee);})("+combiProperty+");");
					if(currentProperty)closes.push("}");
					return "(function(object){"+(currentProperty? "if(object.hasOwnProperty('"+currentProperty+"')){" : "");
				}
			}
			if($6){
				if($10 || $11){
					var c = getCondition($6, $7 ? 7 + $7.length : 7);
					c[0] = c[0].split(/,((\s|\w|\d|_)*)$/gm);
					if($10) minRule= c; else maxRule = c;
					return '';
				}
				if($9)
					closes.push("throw unique;}catch(e){}");
				closes.push('}');
				var conds = getCondition($6, $7 ? 7 + $7.length : 7);
				if($8)
					return "if(JSON.match("+lastProperty+",\""+conds[0]+"\")){" + conds[1].replace(GROUPE_REG, arguments.callee);
				return ($9 ? "try{" : "") +"if("+(conds[0]).replace("object", lastProperty)+"){" + conds[1].replace(GROUPE_REG, arguments.callee);
			}
		})+ (match ? "throw valid;" : mm ? 
			mm[1] ? "var mm = "+mm[1]+"("+lastProperty+");if(!minMax || mm"+(min ? "<" : ">")+"minMax){minMax = mm;_object = __object;}" 
			: "if(!minMax || "+lastProperty+(min ? "<" : ">")+"minMax){minMax = "+lastProperty+";_object = __object;}"
			: "res.push("+lastProperty+");")+ closes.reverse().join('');
		
		if(minRule || maxRule){
			var m = minRule || maxRule;
			fn += "var minMax, _object, __object; JSON.each(res, function(object){__object = object;"+query(m[0][0], false, minRule ? minRule[0] : false, maxRule ? maxRule[0]: false)+"});" 
			+ (!m[1] ? "res = [_object];" : "object = _object;res = [];if(object){" + query(m[1], false, false, false, true))+"}";
		}
		
		var end = (match ? "}catch(e){if(e == valid)return true;}return false;" : mm || rest? "" : "return res;");
		
		if(mm || rest) return fn + end;
		
		fn = new Function("object", fn + end); 
		//met en cache
		cache[match ? "match" : "select"][selector] = fn;
		//pour voire comment les fonctions sont créer
		document.getElementById("de").innerHTML += "function du sélécteur : " + selector + "\n" + fn + "\n\n";
		return fn;
	}
	


	JSON.select = function(object, selector){
		return  (cache.select[selector] || query(selector))(object);
	}
	
	JSON.match = function(object, selector){
		return (cache.match[selector] || query(selector, true))(object);
	}
	
})();


	</script>
</head>
<body>
<!-- pour voire ce que donnes les fonctions;-->
<pre id = 'de'></pre>
<div id = 'test'></div>
</body> 

<script type="text/javascript">
       
	//une JSON simple pour l'exemple. 
	//Un ensemble d'article , ccontenant des commentaire, eux même pouvant contenir des commentaire
	var Articles = [{
		titre : 'les abeilles chantent',
		auteur : 'Marion délisse',
		date : "10 06 2007",
		commentaires : [{
			titre : 'Pas mal!',
			auteur : 'fred',
			date : "10 07 2007",
			contenue : 'du text....',
			commentaires : [{
				titre : 'Merci ;)',
				date : "10 12 2007",
				auteur : 'Marion délisse',
				contenue : 'du text....'
			}]
		},{
			titre : 'Bof',
			auteur : 'jean-jean le blérot',
			date : "10 08 2007",
			contenue : 'du text....',
			commentaires : [{
				titre : 'Hmm',
				auteur : 'Marion délisse',
				date : "10 09 2007",
				contenue : 'du text....'
			},{
				titre : 'N\'importe quoi',
				date : "10 10 2007",
				auteur : 'fred',
				contenue : 'du text....'
			},{
				titre : 'L\'écoute pas mon bébé',
				date : "10 11 2007",
				auteur : 'Joakim',
				contenue : 'du text....'
			}]
		}]
	},{
		titre : 'Jojo le boss !!!!',
		auteur : 'Joakim',
		date : "10 06 2008",
		commentaires : [{
			titre : 'Comment t\es tros fort',
			auteur : 'fred',
			date : "10 07 2008",
			contenue : 'du text....',
			commentaires : [{
				titre : 'Je sais !! ',
				auteur : 'Joakim',
				date : "10 08 2008",
				contenue : 'du text....',
				commentaires : [{
					titre : 'Ca va les chevilles ?',
					date : "10 09 2008",
					auteur : 'jean-jean le blérot',
					contenue : 'du text....',
				}]
			}, {
				titre : 'Bisous mon héro',
				date : "10 10 2008",
				auteur : 'Marion délisse',
				contenue : 'du text....'
			}]
		}]
	},{
		titre : 'les abeilles chantent plus',
		auteur : 'Marion délisse',
		date : "10 06 2009",
		commentaires : [{
			titre : 'C\'est triste',
			date : "10 07 2009",
			auteur : 'fred',
			contenue : 'du text....',
			commentaires : [{
				titre : 'C\'est vrai',
				date : "10 08 2009",
				auteur : 'Marion délisse',
				contenue : 'du text....'
			}]
		}]
	}];
	

	//séléctionne les objets Articles.
	alert("Séléction des objets Articles :" 
	+JSON.select(Articles, ">").length);
	//explication : on séléctionne l'ensemble des enfants de Articles par le sélécteur de descendance directe >. 
	//exemple pas du tout utile vu qu'il renvoie juste une copie de Articles
	
	//Séléction des titre des Articles.
	alert("Séléction des titre des Articles :" 
	+JSON.select(Articles, "> > titre"));
	//explication : on recherche pour chaque article de Articles  > une propriété titre descandant directement de l'article (deuxième > plus la la prorpiété titre) 
	//les espace entre les > ne sont pas obligatoire
	
	//Séléction de l'ensemble des objets possèdant un titres (commentaire compris).
	alert("Séléction de l'ensemble des objets possèdant un titres (commentaire compris) :" 
	+JSON.select(Articles, "*:where(object.titre)").length);
	//explication : on ne séléctionne  tout les objets * 
	//qui définissent un titre , via la clause where et la référence à l'objet en court "object"
	
	//Séléction de l'auteur de l'article les abeilles chantent
	alert("Séléction de l'auteur de l'article les abeilles chantent :" 
	+JSON.select(Articles, "> :whereUnique(object.titre == 'les abeilles chantent') > auteur"));
	//explication : on séléctionne l'ensemble des articles de Articles  (>) 
	//puis pour chaque article on ne séléctionne que celui  qui à comme titre les abeilles chantent via la clause whereUnique et la référence à l'objet en court "object"
	//whereUnique stop la recherche au premier test positif, il peux servir pour définir des clé primaire
	//puis on séléctionne la propriété auteur directement descendante (fille) par > auteur
	
	//Séléction du titre de le l'article le plus récent
	alert("Séléction du titre le l'article le plus récent :" +
	JSON.select(Articles, "> :whereMax(> date, new Date) > titre"));
	//explication : on séléctionne l'ensemble des articles de Articles  (>) 
	//puis on ne séléctionne  celui  qui la date la plus récente :whereMax(> date, new Date)
	//le 1er argument de whereMax définit la proprité devant satisfaire la condition sous forme d'une règle
	//le 2er argument est optionnelle , il définit qu'elle fonction , ou classe permet de comparer la valeur à une autre
	// ici on transforme une string , en date , mais vous pouvait passer tout sorte d'objet
	
	
	//Séléction du titre le l'article qui  comprends le commentaire le plus vieux
	alert("Séléction du titre le l'article qui  comprends le commentaire le plus vieux :" +
	JSON.select(Articles, "> :whereMin(* commentaires > > date, new Date) > titre"));
	//explication : on séléctionne l'ensemble des articles de Articles  (>) 
	//puis on ne séléctionne  celui  qui à le commentaire le plus vieux :whereMin(* commentaire > date, new Date)
		//détail de ->  * commentaires > date , on se trouve dans un article, donc on séléctionne tout les tableaux de commentaires possible commentaires (* commentaires)
		//puis pour chaque commentaire (>) on test  la date ( >date)
	
	//Séléction des titres des commentaires des articles de Marion délisse et dont au moin un des commentaires est édité par Joakim
	alert("Séléction des titres des commentaire des articles de Marion délisse et dont au moin un des commentaires est édité par Joakim : " 
	+JSON.select(Articles, "> :where(object.auteur == 'Marion délisse'):whereMatch(* commentaires > :where(object.auteur == 'Joakim')) > titre"));
	//explication : on séléctionne l'ensemble des articles de Articles  (>) 
	//puis pour chaque article on ne séléctionne que celui  qui à comme auteur Marion délisse via la clause where et la référence à l'objet en court "object"
	//de ses commentaire, on test si au moin un commentaire est éditer par joakim 
			//détail de -> whereMatch(* commentaires > :where(object.auteur == 'Joakim'))
			// * commentaires -> on séléctionne tout les object commentaire descendant 
			// > -> puis pour chaque commentaire
			// :where(object.auteur == 'Joakim') ->  si l'auteur == joakim
			//le teste passe ....
	//enfin on ne séléctionn que les titre  (> titre)
	
	//Séléction des titres des commentaires de fred des articles de Marion délisse et dont au moin un des commentaires est édité par Joakim
	alert("Séléction des titres des commentaires de fred des articles de Marion délisse et dont au moin un des commentaires est édité par Joakim : " +
	JSON.select(Articles, "> :where(object.auteur == 'Marion délisse'):whereMatch(* commentaires > :where(object.auteur == 'Joakim')) * commentaires > :where(object.auteur == 'fred') > titre"));
	//explication : je vous laisse devinner ;)

	//A vous de bidouiller maintenant :) 
</script>
	
	

 Conclusion

Utile pour des services web, renvoyant du json....

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

05 août 2010 00:32:36 :
correction de bug dans la clause where et des exemples + ajout d'explication
05 août 2010 00:33:53 :
...
05 août 2010 02:49:19 :
correction de bug
05 août 2010 20:43:34 :
ajout de la clause whereMatch, + correction de bug
06 août 2010 20:42:24 :
ajout de la clause , whereUnique, whereMin, whereMax + révision du code
06 août 2010 20:55:10 :
...
06 août 2010 21:02:12 :
correction d'un exemple

 Sources du même auteur

Source avec Zip Source avec une capture MENU ANIMER HORIZONTALE OU VERTICAL , ACCÈSSIBLE SANS JS (SA...
Source avec Zip MARQUEE VERSION2 COMPATIBLE MOOTOOLS, JQUERY, PROTOTYPE ET S...
Source avec Zip Source avec une capture UID - FRAMEWORK JAVASCRIPT
Source avec Zip DOMBUILDER
Source avec Zip GETELEMENTSBYREG

 Sources de la même categorie

Source avec Zip Source avec une capture SLIDESHOW IMAGES ET TEXTES EN PUR JAVASCRIPT par ansuzpeorth
Source avec Zip INPUT TEXT AUTOMATIQUE CREATION SUPPRESSION par lycanges
Source avec Zip Source avec une capture TABLE_SV : TABLEAU DYNAMIQUE, MONTRER/CACHER COLONNE SUR DEM... par synanceia
COLONNES ADAPTABLES EN HAUTEUR par dronoide
Source avec Zip VECTEURS ET MATRICES: OUTILS GRAPHIQUES UTILES par william voirol

 Sources en rapport avec celle ci

Source avec Zip REQUÊTE DE TYPE SQL SUR UN OBJET JAVASCRIP COMPLEXE par emericv
Source avec Zip Source avec une capture EXPLORATEUR WEB par XtremDuke

Commentaires et avis

Commentaire de JACKY007 le 06/08/2010 08:52:33

Très intéressant ! Vivement la fin du script.
Rq. : Problème rencontré en ligne 62 de l'exemple (la virgule en fin de ligne...)

Commentaire de Kimjoa le 06/08/2010 20:49:42

salut JACKY007!
Merci pour ton commentaire ;)
J'ai mit à jour le script, qui prend en charge maintenant la gestion des clé primaire (whereUnique) et de recherche sur un maximum ou minimum (whereMin, whereMax);
Je pense pas allé beaucoup plus loin. J'ai fait ce script pour le fun, avant de partir en vacance .. demain :).
Si t'as de suggestions....
a+

Commentaire de ibompuis le 07/08/2010 23:58:10 7/10

Hello Kimjoa,

Super script !
Comment l'utiliser avec un fichier json externe ?

Merci

Commentaire de benben90d le 09/08/2010 08:27:52

bonjour
comment compiler avec un fichiers zipe
merci

Commentaire de Kimjoa le 12/08/2010 11:14:53

salut ibompuis.
Il te suffit de faire une requête ajax si le fichier est sur le même domaine, sinon, d'inclure dans le DOM un tag script pointant vers le fichier. Les librairies le font très bien.

benben90d -> j'ai jamais utiliser la compression zip , donc je peux pas t'aider.

Commentaire de ibompuis le 12/08/2010 18:47:32

Merci Kimjoa,

j'ai essayé avec :

$.ajax({
  dataType: 'json',
  success: function(data) {
   // les requêtes de ton fichier ici
  },
  url: 'data.json'
});

Mais sans succès...
dans "data.json", j'ai mi le contenu de "var Articles"

je sais que tu es en vacance :-), mais un petit exemple simple...

Merci

Commentaire de ibompuis le 12/08/2010 19:55:47

Bon OK fallait pas faire compliqué...

$.getJSON('data.json', function(data) {
  
var Articles = (data);

alert("Séléction des titres des commentaire des articles de Marion délisse et dont au moin un des commentaires est édité par Joakim : "
+JSON.select(Articles, "> :where(object.auteur == 'Marion délisse'):whereMatch(* commentaires > :where(object.auteur == 'Joakim')) > titre"));

});

Merci

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

mysql_query($query) renvoie toujours false avec requête créer dans JavaScript. [ par jbiloeb ] Bonjour Je suis débutant en JavaScript et j&#8217;apprends en autodidacte par l&#8217;exemple donc désolé s&#8217;il y a une (des) grosse(s) bêtise(s) conversion [ par peter2010 ] Bonjour je dois trouver un moyen de convertir du XML pour l'emmagasiner dans des objets JSON (j'ai du xml côté serveur (php) et je veux avoir du json Au secours! Je ne comprends rien à J-Query @__@ [ par KawaiiNaNa ] [size=100]Bonsoir! Bon alors, comme le titre le dis très bien, je démarre avec javascript et j'aimerai aller plus loin pour pouvoir lancer mon blog pr cURL et AJAX [ par stardust69 ] Bonjour, Je voudrais savoir comment faire pour appeler une fonction PHP cURL avec une requête AJAX. La requête AJAX serait elle-même appelé par un for Jquery Autocomplete ( Comment utiliser un requête SQL ) [ par popo60 ] Bonjour à tous, Mon problème est le suivant : Je n'arrive pas a implémenter l'API JQUERY Autocomplete pour faire une requête SQL a la place d'un tab Ajax et jQuery - Faire deux requêtes simultannées [ par lowkey ] Hello tout le monde :) Voici mon problème : J'exécute une requête en Ajax qui peut prendre beaucoup de temps (5 secondes à plusieures heures). Le t Requête SQL générée par des boutons radio [ par loutoune54 ] Bonjour à tous, Je suis confronté aujourd'hui à un problème qui dépasse mes compétences. J'ai un tableau dans ma page qui affiche des données conten JSON cache [ par fahmia2b ] Bonjour, J'ai une requête Ajax qui retourne un JSON, je veut minimiser le nombres de ces requêtes(ils sont les mêmes presque), j'ai utiliser les cook JSON,JSP,AJAX - comment traiter les donnees [ par sipatsymasaka ] Salut, Comment écrire, envoyer et recevoir des données json via ajax: de la page serveur vers la fonction qui traite la réponse , et plus exactement: Ajax et json [ par Mornaloce ] Bonjour, Voilà je vous explique mon problème : Je souhaite reproduire un site existant. Sur ce site j'ai des div imbriqué dans des div. Pour récupér


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,279 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales