Javascript: Como filtrar matriz de objects com base em atributos?

Eu tenho o seguinte conjunto de JavaScript de objects residenciais:

var json = { 'homes': [{ "home_id": "1", "price": "925", "sqft": "1100", "num_of_beds": "2", "num_of_baths": "2.0", }, { "home_id": "2", "price": "1425", "sqft": "1900", "num_of_beds": "4", "num_of_baths": "2.5", }, // ... (more homes) ... ] } var xmlhttp = eval('(' + json + ')'); homes = xmlhttp.homes; 

O que eu gostaria de fazer é poder executar um filtro no object para retornar um subconjunto de objects “home”.

Por exemplo, quero filtrar com base em: price , sqft , num_of_beds e num_of_baths .

Pergunta: Como posso executar algo em JavaScript como o pseudo-código abaixo:

 var newArray = homes.filter( price = 500 & num_of_beds >=2 & num_of_baths >= 2.5 ); 

Note que a syntax não precisa ser exatamente como acima. Este é apenas um exemplo.

Você pode usar o método Array.prototype.filter :

 var newArray = homes.filter(function (el) { return el.price < = 1000 && el.sqft >= 500 && el.num_of_beds >=2 && el.num_of_baths >= 2.5; }); 

Exemplo ao vivo:

 var obj = { 'homes': [{ "home_id": "1", "price": "925", "sqft": "1100", "num_of_beds": "2", "num_of_baths": "2.0", }, { "home_id": "2", "price": "1425", "sqft": "1900", "num_of_beds": "4", "num_of_baths": "2.5", }, // ... (more homes) ... ] }; // (Note that because `price` and such are given as strings in your object, // the below relies on the fact that < = and >= with a string and number // will coerce the string to a number before comparing.) var newArray = obj.homes.filter(function (el) { return el.price < = 1000 && el.sqft >= 500 && el.num_of_beds >= 2 && el.num_of_baths >= 1.5; // Changed this so a home would match }); console.log(newArray); 

Você pode tentar usar framework como jLinq – segue uma amostra de código usando jLinq

 var results = jLinq.from(data.users) .startsWith("first", "a") .orEndsWith("y") .orderBy("admin", "age") .select(); 

Para mais informações você pode seguir o link http://www.hugoware.net/projects/jlinq

Eu prefiro o framework Underscore. Sugere muitas operações úteis com objects. Sua tarefa:

 var newArray = homes.filter( price < = 1000 & sqft >= 500 & num_of_beds >=2 & num_of_baths >= 2.5); 

pode ser sobrescrito como:

 var newArray = _.filter (homes, function(home) { return home.price< =1000 && sqft>=500 && num_of_beds>=2 && num_of_baths>=2.5; }); 

Espero que seja útil para você!

aqui está o violino de trabalho que funciona bem no IE8 usando a function MAP do jquery

http://jsfiddle.net/533135/Cj4j7/

 json.HOMES = $.map(json.HOMES, function(val, key) { if (Number(val.price) < = 1000 && Number(val.sqft) >= 500 && Number(val.num_of_beds) >=2 && Number(val.num_of_baths ) >= 2.5) return val; }); 

Você poderia fazer isso com bastante facilidade – provavelmente existem muitas implementações que você pode escolher, mas esta é a minha ideia básica (e provavelmente há algum formato onde você pode iterar sobre um object com jQuery, eu não consigo pensar nisso agora):

 function filter(collection, predicate) { var result = new Array(); var length = collection.length; for(var j = 0; j < length; j++) { if(predicate(collection[j]) == true) { result.push(collection[j]); } } return result; } 

E então você poderia invocar esta function da seguinte forma:

 filter(json, function(element) { if(element.price < = 1000 && element.sqft >= 500 && element.num_of_beds > 2 && element.num_of_baths > 2.5) return true; return false; }); 

Dessa forma, você pode invocar o filtro com base em qualquer predicado que você definir ou até filtrar várias vezes usando filtros menores.

Você pode usar jQuery.grep () desde o jQuery 1.0:

 $.grep(homes, function (h) { return h.price < = 1000 && h.sqft >= 500 && h.num_of_beds >= 2 && h.num_of_baths >= 2.5 }); 

Você mesmo pode implementar um método de filtro que atenda às suas necessidades. Veja como:

 function myfilter(array, test){ var passedTest =[]; for (var i = 0; i < array.length; i++) { if(test( array[i])) passedTest.push(array[i]); } return passedTest; } var passedHomes = myfilter(homes,function(currentHome){ return ((currentHome.price <= 1000 )&& (currentHome.sqft >= 500 )&&(currentHome.num_of_beds >=2 )&&(currentHome.num_of_baths >= 2.5)); }); 

Espero que ajude!

Ou você pode simplesmente usar $.each (que também funciona para objects, não apenas arrays) e construir um novo array da seguinte forma:

 var json = { 'homes': [{ "home_id": "1", "price": "925", "sqft": "1100", "num_of_beds": "2", "num_of_baths": "2.0", }, { "home_id": "2", "price": "1425", "sqft": "1900", "num_of_beds": "4", "num_of_baths": "2.5", }, // ... (more homes) ... { "home_id": "3-will-be-matched", "price": "925", "sqft": "1000", "num_of_beds": "2", "num_of_baths": "2.5", }, ] } var homes = []; $.each(json.homes, function(){ if (this.price < = 1000 && this.sqft >= 500 && this.num_of_beds >= 2 && this.num_of_baths >= 2.5 ) { homes.push(this); } }); 

Você deve verificar OGX.List, que foi construído em methods de filtragem e estende a matriz padrão de javascript (e também o agrupamento, sorting e localização). Aqui está uma lista de operadores que ele suporta para os filtros:

 'eq' //Equal to 'eqjson' //For deep objects, JSON comparison, equal to 'neq' //Not equal to 'in' //Contains 'nin' //Doesn't contain 'lt' //Lesser than 'lte' //Lesser or equal to 'gt' //Greater than 'gte' //Greater or equal to 'btw' //Between, expects value to be array [_from_, _to_] 'substr' //Substring mode, equal to, expects value to be array [_from_, _to_, _niddle_] 'regex' //Regex match 

Você pode usar dessa maneira

  let list = new OGX.List(your_array); list.addFilter('price', 'btw', 100, 500); list.addFilter('sqft', 'gte', 500); let filtered_list = list.filter(); 

E você pode adicionar quantos filtros desejar (um somente por propriedade)

 var filterHome = homes.filter(home => return (home.price < = 999 && home.num_of_baths >= 2.5 && home.num_of_beds >=2 && home.sqft >= 998)); console.log(filterHome); 

Você pode usar essa function lambda. Mais detalhes podem ser encontrados aqui, pois estamos filtrando os dados com base em que você tem condições que retornam verdadeiro ou falso e ele coletará os dados em uma matriz diferente para que a matriz real não seja modificada.

@JGreig Por favor, olhe para ele.