我有一个像这样的JSON名称集合:
[{
"name":"Jim",
"prize":"Nokia Mobile"
},
{
"name":"Marry",
"prize":"iPhone"
},
{
"name":"Alice",
"prize":"iPad"
}
]
现在我想用字符串过滤这个JSON:var data =" m&#34 ;;
所以,这就是我所做的:
var data= "m";
collection = _.filter(collection,function(c){
return _.any(c,function(k){
return k.name.toLowerCase().indexOf(data.toLowerCase()) != -1;
});
});
所以,在这种情况下,集合返回元素名称为m。
然而,我已经"无法呼叫方法' toLowerCase'未定义"。
我试图发出警报"警告(c.name);"在最后一次返回之前,它返回" undefined"。它不应该,不是吗?
我需要改变什么来解决这个问题?
答案 0 :(得分:4)
请参阅此http://underscorejs.org/#filter
试试这个:
var data= "m";
collection = _.filter(collection,function(myObject){
return myObject.name.toLowerCase().indexOf(data.toLowerCase()) != -1;
});
希望它有所帮助。
答案 1 :(得分:3)
编辑:这里的核心问题似乎是对下划线函数any
和filter
的输入和输出的误解。我在写完答案之后意识到我甚至不确定你的代码应该做什么 - 但是阅读filter和any的文档,以及下面和其他答案中的要点,肯定会帮助你以正确的方式解决问题。
你不应该在这里使用_.any
- 告诉你数组中的任何元素是否通过了测试(作为传递给它的函数实现)。如果您需要测试_.any
,则不应在此处使用name
,只需直接在对象上测试name
。
_.filter
就是你想要的 - 这将返回一个新数组,其中包含传入测试的传入数组中的所有元素(同样,在你传递的函数中实现)。在这种情况下,name
字符串包含data
字符串的所有对象。请参阅下面的代码,了解传递给element
的测试函数中collection
的{{1}}如何传递和使用。
另一点 - 如果你不能保证进入_.filter
的数据的完整性,为了避免错误,你应该首先检查是否定义了name属性 - 如果不是,则测试失败。
collection
此外,你不需要在这里小写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
声明只是其他一些不可预测的输入的占位符: - )
答案 2 :(得分:0)
在示例中,您的JSON无效,字符串确实需要引用,因为微薄指出。
如果它在哪里有效并且您想使用下划线过滤数组,我会使用类似这样的
http://underscorejs.org/#filter
var data = 'm';
var filteredcollection = _.filter(collection, function(item){
return item.name.toLowerCase().indexOf(data) != -1;
});
希望这有帮助
答案 3 :(得分: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);
答案 4 :(得分:0)
您需要在您的值周围加上引号。然后:__具有对象作为集合的函数将2个参数传递给回调函数而不是一个。
_.any({ name:"Jim", price: "Phone" },function(value,key) {
alert(value+" "+key)
});
将通过“吉姆名称”和“手机价格”为您提供提醒。所以你不必在value参数上使用.name属性。