У меня есть следующий массив JavaScript объектов недвижимости дома:
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;
То, что я хотел бы сделать, это иметь возможность выполнить фильтр для объекта, чтобы вернуть подмножество «домашних» объектов.
Например, я хочу , чтобы иметь возможность фильтра на основе: price
, sqft
, num_of_beds
, и num_of_baths
.
Как я могу выполнить что-то в JavaScript, как псевдокод ниже:
var newArray = homes.filter(
price <= 1000 &
sqft >= 500 &
num_of_beds >=2 &
num_of_baths >= 2.5 );
Обратите внимание, что синтаксис не должен быть точно таким же, как указано выше. Это всего лишь пример.
javascript
JGreig
источник
источник
var json = { ... }
JSON - это текстовая запись для обмена данными. (Подробнее здесь.) Если вы имеете дело с исходным кодом JavaScript и не имеете дело со строкой , вы не имеете дело с JSON.Ответы:
Вы можете использовать
Array.prototype.filter
метод:Живой пример:
Показать фрагмент кода
Этот метод является частью нового стандарта ECMAScript 5th Edition , и его можно найти практически во всех современных браузерах.
Для IE вы можете включить следующий метод для совместимости:
источник
Array.prototype.filter.length == 1;
). Когда вы используете второй аргумент, он будет использоваться какthis
значение внутри функции обратного вызова.Вы можете попробовать использовать фреймворк, такой как jLinq - ниже приведен пример использования jLinq.
Для получения дополнительной информации вы можете перейти по ссылке http://www.hugoware.net/projects/jlinq
источник
Я предпочитаю основу Underscore. Он предлагает много полезных операций с объектами. Твое задание:
может быть перезаписано как:
Надеюсь, это будет полезно для вас!
источник
underscore-query
( github.com/davidgtonge/underscore-query ), который использует MongoDB-подобный синтаксис для запроса массивов JavaScript. Так что здесь вы будете использовать_.query(homes, {price: {$lt:1000}, sqft: {$gte: 500}, num_of_beds: {$gte:2}, num_of_baths: {$gte: 2.5}}
Я удивлен, что никто не отправил ответ в одну строку:
... и чтобы вам было проще читать:
источник
Вот рабочая скрипка, которая отлично работает в IE8, используя функцию jquery MAP
http://jsfiddle.net/533135/Cj4j7/
источник
Вы можете использовать jQuery.grep () начиная с jQuery 1.0:
источник
Вы могли бы сделать это довольно легко - вероятно, есть много реализаций, из которых вы можете выбирать, но это моя основная идея (и, возможно, есть какой-то формат, в котором вы можете перебирать объект с помощью jQuery, я просто не могу сейчас об этом думать):
И тогда вы можете вызвать эту функцию так:
Таким образом, вы можете вызывать фильтр на основе любого предиката, который вы определяете, или даже фильтровать несколько раз, используя фильтры меньшего размера.
источник
Вы можете самостоятельно реализовать метод фильтра, который соответствует вашим потребностям, вот как:
Надеюсь, поможет!
источник
Вы должны проверить OGX.List, который имеет встроенные методы фильтрации и расширяет стандартный массив javascript (а также группирование, сортировку и поиск). Вот список операторов, которые он поддерживает для фильтров:
Вы можете использовать это таким образом
Или даже так
Или как один лайнер
источник
Или вы можете просто использовать
$.each
(который также работает для объектов, а не только для массивов) и создать новый массив следующим образом:источник
Я использую свою
ruleOut
функцию для фильтрации объектов на основе определенных значений нежелательных свойств. Я понимаю, что в вашем примере вы хотели бы использовать условия вместо значений, но мой ответ действителен для заголовка вопроса, поэтому я бы хотел оставить здесь свой метод.Скажем, у вас есть список таких актеров:
и вы хотели бы найти всех актеров, которые оценены как звезды Holywood, их национальность не должна быть одной из «английская», «итальянская», «испанская», «греческая», плюс их имя не будет принадлежать к «Mary», 'Джо'. Пример Биззара я знаю! В любом случае, с этим набором условий вы создадите следующий объект:
Хорошо, теперь, если вы
ruleOut(actors, unwantedFieldsFilter)
только получитеИ Билл - твой человек, так как его имя не одно из «Мэри», «Джо», его национальность не включена в [«английский», «итальянский», «испанский», «греческий»], плюс он - звезда!
В моем методе есть одна опция, которая
applyAllFilters
по умолчанию является истинной. Если вы попытаетесь исключить ruleOut с этим параметром, установленным как false, это сработает как фильтрация «ИЛИ» вместо «И». Пример:ruleOut(actors, {job:["actor"], language:["Italian"]}, false)
вы получите всех, кто не является актером или итальянцем:источник
Вы можете использовать эту лямбда-функцию. Более подробную информацию можно найти здесь, так как мы фильтруем данные, исходя из того, что у вас есть условие, которое возвращает истину или ложь, и оно будет собирать данные в другой массив, поэтому ваш фактический массив не будет изменен.
@JGreig Пожалуйста, посмотрите на это.
источник
источник
источник