Как создать поисковую систему & ldquo; simulator & rdquo; используя только массив JavaScript? [Дубликат]

Убедитесь, что у вас есть правильный адрес электронной почты перед отправкой сообщений электронной почты. Если кто-то задает неправильный адрес электронной почты при регистрации, побейте их по голове как можно скорее.

Всегда включайте четкую информацию о том, как отказаться от подписки, в КАЖДОЙ электронной почте.

Это не позволит пользователям помечать ваши письма как спам, потому что «отмена подписки» слишком сложна.

Не нужно подписывать пользователя для отказа от подписки, это должен быть уникальный URL-адрес для отмены подписки на 1 клик. ]
322
задан JGreig 30 November 2016 в 10:10
поделиться

10 ответов

Вы можете использовать метод 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;
});

Live Пример:

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);

Этот метод является частью нового стандарта ECMAScript 5th Edition и может быть найден почти во всех современных браузерах.

Для IE вы можете включить следующее метод совместимости:

if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun /*, thisp*/) {
    var len = this.length >>> 0;
    if (typeof fun != "function")
    throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++) {
      if (i in this) {
        var val = this[i];
        if (fun.call(thisp, val, i, this))
        res.push(val);
      }
    }
    return res;
  };
}
495
ответ дан T.J. Crowder 16 August 2018 в 14:32
поделиться
  • 1
    что есть / *, это p * /? – JGreig 27 April 2010 в 17:09
  • 2
  • 3
    @CMS, вы уверены, что этот код работает? Это возвращает пустой массив, даже когда я устанавливаю цену действительно высокой, а квадраты / кровати / ванны будут действительно низкими. Вы уверены, что этот код работает? – JGreig 27 April 2010 в 18:13
  • 4
    @JGreig: Да, это работает, вы должны проверить свои критерии, возможно, вы могли бы разместить более полный пример своего JSON в pastie.org или jsbin.com и критерии вы используете фильтр, чтобы я мог помочь вам лучше. – CMS 27 April 2010 в 18:24
  • 5
    @CMS Было бы хорошо, если бы ответ включал в себя тот факт, что возвращается новый массив, исходный массив не изменяется. Хотя это сказано в приведенной ссылке, я нахожу ответ без этого, является неполным или неточным – Gerard 27 August 2016 в 10:48

Вы можете использовать jQuery.grep (), поскольку 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
});
9
ответ дан Akira Yamamoto 16 August 2018 в 14:32
поделиться

Вы можете реализовать метод фильтра, который соответствует вашим потребностям, вот как это сделать:

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));
});

Надеюсь, это поможет!

3
ответ дан Bono 16 August 2018 в 14:32
поделиться
  • 1
    Мое предикатное условие изменяется от разных onclicks. Как сохранить текущие значения предикатов и применить их к функции myfilter всякий раз, когда я захочу? – Malay Desai 18 May 2017 в 08:01

Вы должны проверить OGX.List , который имеет встроенные методы фильтрации и расширяет стандартный массив javascript (а также группировку, сортировку и поиск). Вот список операторов, которые он поддерживает для фильтров:

'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

Вы можете использовать его таким образом

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

И вы можете добавить столько фильтров, сколько хотите (по одному в только свойство)

1
ответ дан Eric 16 August 2018 в 14:32
поделиться

Я предпочитаю фреймворк Underscore. Он предлагает много полезных операций с объектами. Ваша задача:

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

может быть перезаписана как:

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

Надеюсь, это будет полезно для вас!

23
ответ дан JuliaCesar 16 August 2018 в 14:32
поделиться
  • 1
    Как это подчеркивает вещь и что именно это означает? – John Demetriou 15 January 2015 в 10:36
  • 2
    Просто обнаружил 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}} – prototype 20 January 2015 в 00:18

Вы можете сделать это довольно легко - возможно, есть много вариантов реализации, но это моя основная идея (и, вероятно, есть какой-то формат, в котором вы можете перебирать объект с помощью jQuery, я просто не могу думать об этом правильно теперь):

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;
}

И тогда вы можете вызвать эту функцию следующим образом:

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;
});

Таким образом, вы можете вызывать фильтр на основе любого предиката, который вы определяете, или даже фильтруйте несколько раз, используя фильтры меньшего размера.

7
ответ дан Malay Desai 16 August 2018 в 14:32
поделиться
  • 1
    Измените & int int & quot; к "длине var" в первом фрагменте – Malay Desai 18 May 2017 в 07:59
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);

Вы можете использовать эту лямбда-функцию. Более подробную информацию можно найти здесь, поскольку мы фильтруем данные на основе вашего условия, которое возвращает true или false, и оно будет собирать данные в разных массивах, чтобы ваш фактический массив не был изменен.

@JGreig Пожалуйста, изучите его.

0
ответ дан marc_s 16 August 2018 в 14:32
поделиться
  • 1
    @luffy Не делайте этого. – hardik beladiya 17 July 2018 в 08:52
  • 2
    Вы можете проверить, что я изменил в вашем ответе. Я не ответил на ваш ответ, другие могли бы. – LuFFy 17 July 2018 в 10:21

Или вы можете просто использовать $.each (который также работает для объектов, а не только для массивов) и построить новый массив следующим образом:

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);
    }
});
1
ответ дан Nux 16 August 2018 в 14:32
поделиться

Вы можете попробовать использовать фреймворк вроде jLinq. Ниже приведен пример кода использования jLinq

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

. Для получения дополнительной информации вы можете перейти по ссылке http://www.hugoware.net/ проекты / jlinq

26
ответ дан Rutesh Makhijani 16 August 2018 в 14:32
поделиться

здесь рабочая скрипка, которая отлично работает в IE8 с использованием функции jQuery MAP

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;
});
9
ответ дан Akira Yamamoto 17 August 2018 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: