Javascript 使用下划线过滤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 =

我得到了一个JSON名称集合,如下所示:

[{

   "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提供了这个详细的说明