【问题标题】:How to search JSON array with search filter form?如何使用搜索过滤器形式搜索 JSON 数组?
【发布时间】:2013-12-31 21:47:46
【问题描述】:

我有一个 JSON 数组和一个带有多个过滤器的搜索表单。在这个搜索表单中,我有 4 个选择下拉字段进行过滤。如何根据用户选择的内容搜索 JSON 数组,然后在他们点击提交按钮后显示结果?

例如,如果用户在“Food Select Drop Down”字段中选择“Burger”,在“Drink Select Drop Down”字段中选择“Coke”。我希望能够显示提供这两种商品的所有餐厅。这可能吗?

var restaurants = [
            {"restaurant" : { "name" : "McDonald's", "food" : "burger", "drink" : "coke", "content" : "Lorem ipsum dolor sit amet" }},
            {"restaurant" : { "name" : "KFC", "food" : "chicken", "drink" : "pepsi", "content" : "Lorem ipsum dolor sit amet" }},
            {"restaurant" : { "name" : "Pizza Hut",  "food" : "pizza", "drink" : "sprite", "content" : "Lorem ipsum dolor sit amet" }},
            {"restaurant" : { "name" : "Dominos",  "food" : "pizza", "drink" : "root beer", "content" : "Lorem ipsum dolor sit amet" }},
            {"restaurant" : { "name" : "Popeyes",  "food" : "chicken", "drink" : "mist", "content" : "Lorem ipsum dolor sit amet" }}
          ];

【问题讨论】:

  • 您可以遍历您的 JSON 数组并在适当的地方进行条件过滤。你需要一个例子吗?如果是这样,请给我们一个 JSON 数组的示例。您可以直接在帖子中添加此内容。
  • 感谢您的快速回复。我编辑了我的帖子并添加了我的 json 数组的示例。
  • 由于您没有使用angular.js,因此我不会将此作为答案,但我建议将其用于这种特殊情况。这是一个现场演示:jsfiddle.net/lacoolj/UACue,文档可以在这里找到:docs.angularjs.org/tutorial/step_03
  • 更贴近您的问题,这将适合作为一个非常基本的启动器:jsfiddle.net/lacoolj/2TvLH

标签: javascript jquery arrays json


【解决方案1】:

过滤数组的一种方法如下

function filter( restaurants, food, drink) { 

    var result = [];

    for( var i= 0, len = restaurants.length; i < len; i++) {
        var el = restaurants.restaurant[i];

        if( el.food === food && el.drink === drink ) {
            result.push( el );
        }
    }

    return result;
}

更实用的方式

可以使用Array原型中定义的filter方法

function customFilter(food, drink) {
   return function(el) {
      var r = el.restaurant;
      return r.food === food && r.drink === drink;
   }
}

restaurants.filter( customFilter('Burger', 'Coke') );

复杂的通用过滤器

function customFilter(values) {
   return function(el) {
      var r = el.restaurant;
      var keys = Object.keys( values );
      var answer = true;

      for( var i = 0, len = keys.length; i < len; i++) {
          if( r[keys[i]] !== values[keys[i]] ) {
              answer = false;
              break;
          }
      }

      return answer;
   }
}

restaurants.filter( customFilter({'food':'Burger', 'drink': 'Coke'}) );    

【讨论】:

  • 缺少每个对象的 restaurant 属性
  • 哦:P,我会修复它
  • 返回的对象是对原始数组对象的引用吗?我需要修改原始数组中的一个数组元素
【解决方案2】:

JavaScript 有一个原生的Array.prototype.filter,它接受一个函数。您只想在用户选择输入时生成此函数,例如

function filter(a, food, drink) {
    food = food ? food.toLowerCase() : 0;
    drink = drink ? drink.toLowerCase() : 0;
    return a.filter(function (e) {
        if (food && e.restaurant.food.toLowerCase().indexOf(food) === -1)
            return false;
        if (drink && e.restaurant.drink.toLowerCase().indexOf(drink) === -1)
            return false;
        return true;
    });
}

filter(restaurants, 'burger', 'coke');
// [{"restaurant":{"name":"McDonald's","food":"burger","drink":"coke","content":"Lorem ipsum dolor sit amet"}}]

【讨论】:

    【解决方案3】:

    我已经对 Igor 的回答投了票,但是,因为我想在 jsfiddle 中放一个完整的例子,所以你去:http://jsfiddle.net/jeffrenaud/JDYMt/

    我添加了“任何”选项的可能性,因此特定元素上没有过滤器。

    总结如下:

    HTML:

    <label for="food">Food:</label>
    <select id="food">
        <option value="">Any</option>
        <option value="burger">Burger</option>
        <option value="chicken">Chicken</option>
        <option value="pizza">Pizza</option>
    </select>
    
    <label for="drink">Drink:</label>
    <select id="drink">
        <option value="">Any</option>
        <option value="coke">Coke</option>
        <option value="pepsi">Pepsi</option>
        <option value="sprite">Sprite</option>
        <option value="root beer">Root beer</option>
        <option value="mist">Mist</option>
    </select>
    
    <ul id="result"></ul>
    

    JavaScript:

    var restaurants = [
        {
            "restaurant": {
                "name": "McDonald's",
                "food": "burger",
                "drink": "coke",
                "content": "Lorem ipsum dolor sit amet"
            }
        },
        {
            "restaurant": {
                "name": "KFC",
                "food": "chicken",
                "drink": "pepsi",
                "content": "Lorem ipsum dolor sit amet"
            }
        },
        {
            "restaurant": {
                "name": "Pizza Hut",
                "food": "pizza",
                "drink": "sprite",
                "content": "Lorem ipsum dolor sit amet"
            }
        },
        {
            "restaurant": {
                "name": "Dominos",
                "food": "pizza",
                "drink": "root beer",
                "content": "Lorem ipsum dolor sit amet"
            }
        },
        {
            "restaurant": {
                "name": "Popeyes",
                "food": "chicken",
                "drink": "mist",
                "content": "Lorem ipsum dolor sit amet"
            }
        }
      ];
    
    var $food = $('#food'),
        $drink = $('#drink'),
        $result = $('#result');
    
    $food.change(function () {
        onChange();
    });
    
    $drink.change(function () {
        onChange();
    });
    
    function onChange() {
        var findedRestaurants = findRestaurants();
        showRestaurants(findedRestaurants);
    }
    
    function findRestaurants() {
        return filter($food.find('option:selected').val(), $drink.find('option:selected').val());
    }
    
    function filter(food, drink) {
        var result = [];
    
        for (var i = 0; i < restaurants.length; i++) {
            var restaurant = restaurants[i].restaurant;
            if ((!food || restaurant.food === food) && (!drink || restaurant.drink === drink)) {
                result.push(restaurant);
            }
        }
    
        return result;
    }
    
    function showRestaurants(restaurants) {
        $result.empty();
        for (var i = 0; i < restaurants.length; i++) {
            $result.append($('<li>' + restaurants[i].name + '</li>'));
        }
    }
    
    onChange();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2018-12-24
      • 2015-12-21
      • 2020-05-10
      • 2017-07-24
      • 1970-01-01
      相关资源
      最近更新 更多