2014-01-08 3 views
1

Я получил JSON коллекцию имен как это:фильтрации JSON с помощью подчеркивания

[{ 

    "name":"Jim", 
    "prize":"Nokia Mobile" 
    }, 
    { 

    "name":"Marry", 
    "prize":"iPhone" 
    }, 
    { 

    "name":"Alice", 
    "prize":"iPad" 
    } 

] 

Теперь я хотел бы, чтобы отфильтровать JSON с помощью строки: вар данных = «м»;

так это то, что я сделал:

var data= "m"; 

    collection = _.filter(collection,function(c){ 


     return _.any(c,function(k){ 


      return k.name.toLowerCase().indexOf(data.toLowerCase()) != -1; 

     }); 


    }); 

так, в этом случае сбор возврата элементов, который имеет м от их имени.

Однако у меня есть метод «Невозможно вызвать метод toLowerCase« неопределенного ».

Я попытался поставить предупреждение «alert (c.name);» перед последним возвратом, и он возвращается «undefined». Это не должно быть, не так ли?

Что нужно изменить, чтобы исправить это?

+0

Это недействительно JSON ... в ваших значениях отсутствуют кавычки. – meagar

ответ

3

Смотреть это http://underscorejs.org/#filter

Попробуйте это:

var data= "m"; 

collection = _.filter(collection,function(myObject){ 
    return myObject.name.toLowerCase().indexOf(data.toLowerCase()) != -1; 
}); 

Надеется, что это помогает.

0

Верно, что ваш JSON в примере недействителен, строки нуждаются в котировках, как указано ниже.

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

http://underscorejs.org/#filter

var data = 'm'; 
var filteredcollection = _.filter(collection, function(item){ 
    return item.name.toLowerCase().indexOf(data) != -1; 
}); 

Надеется, что это помогает

+1

Я думаю, что он хочет отфильтровать по имени, в этом случае item - это весь Object. –

+0

ваше право спасибо mate: D – rabs

0

Вы сделали это слишком сложно, просто :

var data = [{ 
    "name":"Jim", 
    "prize":"Nokia Mobile" 
    }, 
    { 

    "name":"Marry", 
    "prize":"iPhone" 
    }, 
    { 

    "name":"Alice", 
    "prize":"iPad" 
    } 
]; 

var fiterTerm = "m"; 

var collection = _.filter(data, function(item){ 
    return item.name.toLowerCase().indexOf(fiterTerm.toLowerCase()) != -1; 
}); 

console.log(collection); 
+0

Благодарим вас за ответ – JavaScripter

3

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


Вы не должны использовать _.any здесь - что говорит вам, если любой элемент массива проходит тест (реализованный в виде функции, которую вы передаете к нему). Вы не должны использовать _.any здесь, если вам нужно проверить name, просто проверьте name прямо на объект.

_.filter - это все, что вам нужно - это возвращает новый массив, содержащий все элементы из переданного массива, которые проходят тест (аналогично, реализованный в функции, которую вы передаете). В этом случае все объекты, где строка name содержит строку data. См. Код ниже для ясности о том, как каждый element от collection передается и используется внутри тестовой функции, переданной в _.filter.

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

var collection = [ 
    { 
     "name":"Jim", 
     "prize":"Nokia Mobile" 
    }, 
    { 
     "name":"Marry", 
     "prize":"iPhone" 
    }, 
    { 
     "name":"Alice", 
     "prize":"iPad" 
    }]; 

var data = 'm'; 

collection = _.filter(collection,function(element){ 
    return element.name && element.name.toLowerCase().indexOf(data.toLowerCase()) != -1; 
}); 

Кроме того, вам не нужно в нижний регистр data здесь - вы знаете, что в нижнем регистре - если это data = 'm' декларация не является просто заполнителем для какого-то другой, непредсказуемого, ввода :-)

+0

Вы * можете * использовать '_.any' на объекте - методы сбора поддеревьев работают как с объектами, так и с массивами. – nrabinowitz

+0

Да, действительно, я переписал этот бит - я хотел сказать, что OP использует его неправильно на объекте в этом сценарии, так как непонятно, что он пытается добиться. – davnicwil

+0

Спасибо за эту подробную иллюстрацию. – JavaScripter

0

Вам нужно положить котировки вокруг ваших значений. И затем: _any функция с объектом, поскольку коллекция передает 2 параметра функции обратного вызова, а не одну.

_.any({ name:"Jim", price: "Phone" },function(value,key) { 
    alert(value+" "+key) 
}); 

Дадут вам оповещения с именем «Джим», а затем «Телефонная цена». поэтому вам не нужно использовать свойство .name в параметре значения.

Смежные вопросы