Eu tenho a seguinte matriz JavaScript de objetos domésticos de imóveis:
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 objeto para retornar um subconjunto de objetos "iniciais".
Por exemplo, eu quero ser capaz de filtro com base em: price
, sqft
, num_of_beds
, e num_of_baths
.
Como posso executar algo em JavaScript, como o pseudo-código abaixo:
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Observe que a sintaxe não precisa ser exatamente como acima. Este é apenas um exemplo.
javascript
JGreig
fonte
fonte
var json = { ... }
JSON é uma notação textual para troca de dados. (Mais aqui.) Se você está lidando com o código-fonte JavaScript e não com uma string , não está lidando com o JSON.Respostas:
Você pode usar o
Array.prototype.filter
método:Exemplo ao vivo:
Mostrar snippet de código
Esse método faz parte do novo padrão ECMAScript 5th Edition e pode ser encontrado em quase todos os navegadores modernos.
Para o IE, você pode incluir o seguinte método para compatibilidade:
fonte
Array.prototype.filter.length == 1;
). Quando você usa o segundo argumento, ele será usado como othis
valor dentro da função de retorno de chamada.Você pode tentar usar uma estrutura como o jLinq - a seguir, uma amostra de código do uso do jLinq
Para mais informações, você pode seguir o link http://www.hugoware.net/projects/jlinq
fonte
Eu prefiro a estrutura de sublinhado. Ele sugere muitas operações úteis com objetos. Sua tarefa:
pode ser substituído como:
Espero que seja útil para você!
fonte
underscore-query
( github.com/davidgtonge/underscore-query ) que usa sintaxe semelhante ao MongoDB para consultar matrizes javascript. Então, aqui você usaria_.query(homes, {price: {$lt:1000}, sqft: {$gte: 500}, num_of_beds: {$gte:2}, num_of_baths: {$gte: 2.5}}
Estou surpreso que ninguém postou a resposta de uma linha:
... e para que você possa ler com mais facilidade:
fonte
aqui está o violino que funciona bem no IE8 usando a função jquery MAP
http://jsfiddle.net/533135/Cj4j7/
fonte
Você pode usar o jQuery.grep () desde o jQuery 1.0:
fonte
Você poderia fazer isso com bastante facilidade - provavelmente existem muitas implementações que você pode escolher, mas esta é minha ideia básica (e provavelmente existe algum formato em que você pode iterar sobre um objeto com jQuery, não consigo pensar nisso agora):
E então você poderia invocar essa função da seguinte maneira:
Dessa forma, você pode chamar o filtro com base em qualquer predicado definido ou até filtrar várias vezes usando filtros menores.
fonte
Você pode implementar um método de filtro que atenda às suas necessidades, eis como:
Espero que ajude!
fonte
Você deve verificar o OGX.List, que tem métodos de filtragem integrados e estende a matriz javascript padrão (e também agrupa, classifica e localiza). Aqui está uma lista de operadores suportados pelos filtros:
Você pode usá-lo desta maneira
Ou mesmo assim
Ou como um forro
fonte
Ou você pode simplesmente usar
$.each
(que também funciona para objetos, não apenas matrizes) e criar uma nova matriz da seguinte forma:fonte
Uso minha
ruleOut
função para filtrar objetos com base em valores específicos de propriedades indesejadas. Entendo que no seu exemplo você gostaria de usar condições em vez de valores, mas minha resposta é válida para o título da pergunta, portanto, gostaria de deixar meu método aqui.Digamos que você tenha uma lista de atores como este:
e você gostaria de encontrar todos os atores classificados como estrelas de Holywood, a nacionalidade deles não deve ser 'Inglês', 'Italiano', 'Espanhol', 'Grego', além de seu nome não ser 'Mary', 'Joe'. Exemplo de Bizzar, eu sei! De qualquer forma, com esse conjunto de condições, você criaria o seguinte objeto:
OK, agora se você
ruleOut(actors, unwantedFieldsFilter)
só conseguirE Bill é seu homem, já que o nome dele não é 'Mary', 'Joe', sua nacionalidade não está incluída em ['Inglês', 'Italiano', 'Espanhol', 'Grego'], além de ser uma Estrela!
Existe uma opção no meu método, que é
applyAllFilters
e é verdadeira por padrão. Se você tentasse ruleOut com esse parâmetro definido como false, isso funcionaria como uma filtragem 'OR' em vez de 'AND'. Exemplo:ruleOut(actors, {job:["actor"], language:["Italian"]}, false)
você daria a todos que não são atores ou italianos:fonte
Você pode usar esta função lambda. Mais detalhes podem ser encontrados aqui, pois estamos filtrando os dados com base nas suas condições, que retornam verdadeiro ou falso, e os dados serão coletados em uma matriz diferente para que sua matriz real não seja modificada.
@JGreig Por favor, olhe para ele.
fonte
fonte
fonte