Хорошо, я вижу, что довольно много людей заинтересованы в этом, поэтому вот что у меня есть до сих пор:
var filter = function(what,where) {
var sameArrays = function(arr,arr1) {
var al = arr.length, bl = arr1.length;
if (al !== bl || al === 0 || bl === 0) { return; }
for (var i = al - 1; i >= 0; i--){
if (!match(arr[i], arr1[i])) { return; }
}
return arr1;
};
var sameObjects = function(obj,obj1) {
for (var i in obj) {
if(!obj1.hasOwnProperty(i)){return;}
if (!match(obj[i],obj1[i])) {return;}
}
return obj1;
};
var inArray = function(value,obj) {
var r = [],
m = match;
for (var i = obj.length - 1; i >= 0; i--){
var item = obj[i];
if( m(value,item) ) {
r.push( item );
}
};
return (r.length) ? r : undefined ;
};
var inObject = function(value,obj) {
var r = [],
m = match;
for(var i in obj){
var item = obj[i];
if( m(value,item) ) {
r.push( item );
}
};
return (r.length) ? r : undefined ;
};
var inString = function(value,string) {
var valueConstructor = value.constructor;
if( valueConstructor === RegExp) {
return (value.test(string)) ? string : undefined ; }
else if( valueConstructor === Function && value(string) === true ) {
return string; }
};
var match = function(a,b) {
if(typeof a === 'undefined' || typeof b === 'undefined' || a === null || b === null) {
return; }
if (a == b) {
return b;}
var vc = a.constructor,
oc = b.constructor;
// Cannot compare array or object to a string or a number
if( (vc === Array || vc === Object) && (oc === String || oc === Number) ) {
return; }
if( oc === Array && vc === Array ) {
return sameArrays(a,b); }
else if(oc === Array) {
return inArray(a,b); }
else if (oc === Object && vc === Object) {
return sameObjects(a,b); }
else if (oc === Object) {
return inObject(a,b); }
else if (vc === Object || vc === Array) {
return; }
else if (oc === String || oc === Number){
return inString(a,b); }
};
return match(what,where);
};
Что позволяет сделать следующее:
var b = [
{ 'name' : 'some name', age: 23, id: 0, 'has' : ['dogs'] },
{ 'name' : 'some name 2', age:24, id: 1, 'has' : ['dogs', 'cats'] },
{ 'name' : 'some name 3', age: 25, id: 2 , 'has' : ['donkeys', 'goats']},
{ 'name' : 'some name 4', age:26, id: 3, 'has' : ['parrots', 'treasure'] },
{ 'name' : 'some name 5', age:27, id: 4, 'has' : undefined }
];
filter({ age:23 },b)
filter({ age:'24' },b)
filter({ name: /\d$/ },b)
filter('dogs',b)
filter({ has: 'goats' },b)
Это часть какой-то библиотеки js, над которой я работал, поэтому, если вы обнаружите, что работаете с json + dom, попробуйте поискать код Google для jdatastore .