使用下划线过滤JSON

时间:2014-01-08 23:17:40

标签: javascript json backbone.js underscore.js

我有一个像这样的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"。它不应该,不是吗?

我需要改变什么来解决这个问题?

5 个答案:

答案 0 :(得分:4)

请参阅此http://underscorejs.org/#filter

试试这个:

var data= "m";

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

希望它有所帮助。

答案 1 :(得分:3)

编辑:这里的核心问题似乎是对下划线函数anyfilter的输入和输出的误解。我在写完答案之后意识到我甚至不确定你的代码应该做什么 - 但是阅读filterany的文档,以及下面和其他答案中的要点,肯定会帮助你以正确的方式解决问题。


你不应该在这里使用_.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属性。