Accueil > > > SYSTÈME DE REQUÊTE SUR DES DONNÉES JSON
SYSTÈME DE REQUÊTE SUR DES DONNÉES JSON
Information sur la source
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....
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
Sources de la même categorie
Commentaires et avis
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’apprends en autodidacte par l’exemple donc désolé s’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
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
UTILISER UN .JSUTILISER UN .JS par zaikoe
Cliquez pour lire la suite par zaikoe
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|