Jquery Grep & Map Json с использованием нескольких ключевых слов - PullRequest
2 голосов
/ 19 января 2012

Я хочу фильтровать и искать через Json, используя несколько ключевых слов. У меня это работает, когда есть только одно значение для проверки, но мне нужно использовать несколько фильтров поиска по ключевым словам.

В этом примере я хочу вернуть объекты, связанные с Wal-mart и Китаем, но НЕ Wal-Mart в США или Target в Китае.

Я создаю массив ключевых слов для фильтрации, используя Grep () и Map, в консоли. Однако я не могу понять синтаксис для проверки значения по ключевому слову (см. Мой комментарий ниже: «Это неправильно.»)

<!DOCTYPE html>

<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.pack.js"></script>
<script>

var keywords = ["China", "Wal-Mart"];//filter Json by these terms

var data = [
    {
    "name": "Store #1",
    "country": "China",
    "retailer": "Wal-Mart"
    },
    {
    "name": "New Store #2",
    "country": "China",
    "retailer": "Wal-Mart"
    },
    {
    "name": "Store Name US",
    "country": "United States",
    "retailer": "Wal-Mart"
    },
    {
    "name": "Target #98237",
    "country": "China",
    "retailer": "Target"
    }
]
var searchkeywords = $.grep(data, function(value,i) { 

return value[i] === keywords[i];//<--- This is not right

//should be the equivalent of above keywords:
//return value.country.toLowerCase() === "china" && value.retailer.toLowerCase() === "wal-mart" 
});

var keywordsearchresult = $.map(searchkeywords, function(value, i) {
    return {
        name: value.name,
        country: value.country,
        retailer: value.retailer
    };
});
console.log(keywordsearchresult);//should return first 2 items
</script>
</head>

<body>
</body>
</html>

В моем приложении будет больше ключевых слов и элементов (тип, дата и т. Д.) В Json, это просто упрощенная версия. Я в основном хочу добавить много правил и условий в Grep.

1 Ответ

2 голосов
/ 19 января 2012

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

var keywords = [
    {
        field: "country",
        value: "China"
    },
    {
        field: "retailer",
        value: "Wal-Mart"
    }
]; 

Это позволяет вашему поиску искать соответствующие поля для каждого слова. Тогда вы можете изменить свой grep на это:

var results = $.grep(data, function(value, i) {
    for(var i=0;i<keywords.length;i++){
        if(value[keywords[i].field] !== keywords[i].value){
            return false   
        }
    }

    return true;        
});

Я удалил часть map, потому что не вижу смысла в ней. Тогда вы остались с этим:

http://jsfiddle.net/kZWef/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...