Javascript 使用下划线过滤JSON
我得到了一个JSON名称集合,如下所示:Javascript 使用下划线过滤JSON,javascript,json,backbone.js,underscore.js,Javascript,Json,Backbone.js,Underscore.js,我得到了一个JSON名称集合,如下所示: [{ "name":"Jim", "prize":"Nokia Mobile" }, { "name":"Marry", "prize":"iPhone" }, { "name":"Alice", "prize":"iPad" } ] 现在我想用一个字符串过滤这个JSON:var data=“m” 这就是我所做的: var data= "m"; collection =
[{
"name":"Jim",
"prize":"Nokia Mobile"
},
{
"name":"Marry",
"prize":"iPhone"
},
{
"name":"Alice",
"prize":"iPad"
}
]
现在我想用一个字符串过滤这个JSON:var data=“m”
这就是我所做的:
var data= "m";
collection = _.filter(collection,function(c){
return _.any(c,function(k){
return k.name.toLowerCase().indexOf(data.toLowerCase()) != -1;
});
});
因此,在本例中,集合返回名称中有m的元素
然而,我得到了“无法调用未定义的方法‘toLowerCase’”
我试图在最后一次返回之前添加一个警报“alert(c.name);”,返回值为“undefined”。不应该,不是吗
我需要更改什么来修复此问题?请参见此
试试这个:
var data= "m";
collection = _.filter(collection,function(myObject){
return myObject.name.toLowerCase().indexOf(data.toLowerCase()) != -1;
});
希望有帮助。看到了吗
试试这个:
var data= "m";
collection = _.filter(collection,function(myObject){
return myObject.name.toLowerCase().indexOf(data.toLowerCase()) != -1;
});
希望有帮助。真的,示例中的JSON无效,正如米格尔指出的,字符串确实需要引号 如果它在哪里有效,并且您想使用下划线过滤数组,我会使用类似这样的方法
希望这有助于确认示例中的JSON无效,正如米格尔指出的那样,字符串确实需要引号 如果它在哪里有效,并且您想使用下划线过滤数组,我会使用类似这样的方法
希望这有帮助你把它弄得太复杂了,简单地说:
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);
你把它弄得太复杂了,很简单:
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);
EDIT:您的核心问题似乎是对下划线函数
any
和filter
的输入和输出的误解。在写了我的答案之后,我意识到我甚至不确定你的代码应该做什么——但是阅读和的文档,以及下面和其他答案中的要点,肯定会帮助你以正确的方式解决问题
您不应该在这里使用
\ any
——它告诉您数组中的任何元素是否通过了测试(作为传递给它的函数实现)。您不应该在这里使用任何,如果您需要测试名称
,只需直接在对象上测试名称
\uU4.filter
是您想要的全部-这将返回一个新数组,其中包含传入数组中通过测试的所有元素(同样,在您通过的函数中实现)。在本例中,名称
字符串包含数据
字符串的所有对象。请参阅下面的代码,以了解如何在传递给的测试函数中传递和使用集合中的每个元素
另一点-如果您不能保证进入集合的数据的完整性,为了避免错误,您应该首先检查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'
声明只是一些其他不可预测的占位符,输入:-)编辑:这里的核心问题似乎是对下划线函数any
和过滤器的输入和输出的误解。在写了我的答案之后,我意识到我甚至不确定你的代码应该做什么——但是阅读和的文档,以及下面和其他答案中的要点,肯定会帮助你以正确的方式解决问题
您不应该在这里使用\ any
——它告诉您数组中的任何元素是否通过了测试(作为传递给它的函数实现)。您不应该在这里使用任何
,如果您需要测试名称
,只需直接在对象上测试名称
\uU4.filter
是您想要的全部-这将返回一个新数组,其中包含传入数组中通过测试的所有元素(同样,在您通过的函数中实现)。在本例中,名称
字符串包含数据
字符串的所有对象。请参阅下面的代码,以了解如何在传递给的测试函数中传递和使用集合中的每个元素
另一点-如果您不能保证进入集合的数据的完整性,为了避免错误,您应该首先检查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'
声明只是一些其他不可预测的输入的占位符:-)您需要在值周围加引号。然后:\任何以对象作为集合的函数都会向回调函数传递两个参数,而不是一个参数
_.any({ name:"Jim", price: "Phone" },function(value,key) {
alert(value+" "+key)
});
将向您发送带有“Jim姓名”和“电话价格”的提醒。因此,您不必在value参数上使用.name属性。您需要在值周围加引号。然后:\任何以对象作为集合的函数都会向回调函数传递两个参数,而不是一个参数
_.any({ name:"Jim", price: "Phone" },function(value,key) {
alert(value+" "+key)
});
将向您发送带有“Jim姓名”和“电话价格”的提醒。因此,您不必在value参数上使用.name属性。这是无效的JSON。。。您的值缺少引号。这不是有效的JSON。。。你的值缺少引号。我想他想按名称筛选,在这种情况下,项是整个对象。我想他想按名称筛选,在这种情况下,项是整个对象。你可以使用。
对对象进行任何操作-下划线收集方法对对象和数组都有效。是的,我将重写这一点-我想说的是,在这种情况下,OP在一个对象上错误地使用了它,因为不清楚他们试图实现什么。谢谢danvicwil提供了这个详细的说明。你可以在对象上使用。
任何对象-下划线收集方法都可以在对象和数组上工作。是的,我将重写这一点-我想说的是OP在这个场景中对一个对象使用了错误的方法,因为不清楚他们想要实现什么感谢danvicwil提供了这个详细的说明