使用下划线从对象列表中过滤匹配值

问题描述:

我在我的项目中使用了UnderscoreJs。我必须过滤包含具有属性的对象的数组。我需要根据这些值进行过滤。该值可以是对象的任何属性。例如:“迷你”应取两者“丰田”和“本田”,因为“小”,是存在两个对象使用下划线从对象列表中过滤匹配值

[{ name:"Toyota minivan", id:"506", size: "large" }, { name:"Honda Civic", id:"619", size: "mini" }] 

如何使用下划线做的一部分。我尝试了以下方法,但无法正常工作。

var searchStr="mini"; 
var evens = _.filter([arrayData], function(obj){ return _.contains(obj, searchStr); }); 

请问我能告诉我哪里出错了吗?

_.contains只适用于数组,因此您需要首先从每个对象中获取值,然后检查它们中是否包含搜索字符串。在本例中,我使用了some,与indexOf一起匹配字符串。

var searchStr="mini"; 
var mini = _.filter(arr, function (obj) { 
    return _.values(obj).some(function (el) { 
     return el.indexOf(searchStr) > -1; 
    }); 
}); 

DEMO

哦,我用简单的if条件,这样在将来如果要列出MINI在一个阵列和大型在一个阵列中,所以你可以很容易地做到做到了这一点。如果匹配,我检查了对象属性,然后分配给新列表。这是我的代码。并在这里查看演示fiddle

var list=[{ name:"Toyota minivan", id:"506", size: "large" }, 
       { name:"Honda Civic", id:"619", size: "mini" }, 
       {name:"zen",id:"606",size:"mini"}]; 
    var result=_.filter(list, function(obj){ 
        if(obj.size=='mini'){ 
        var matchedcars=obj; 
        console.log("result"+JSON.stringify(matchedcars)); 
        } 
        return matchedcars; 
    }); 
    alert("result"+JSON.stringify(result)); 
+0

此解决方案部分工作,因为'obj.size =='mini''是硬编码的。检查应该通过验证对象的所有属性来完成,而不是特定于'size'属性。 – zilcuanu 2014-09-03 13:39:56

+0

你的意思是部分?并且只有在将来您添加新属性时,您接受的内容才能用于索引目的?索引更改,我在我的项目中使用了这种类型的比较,它工作正常。无论如何兄弟你得到答案这就是进出口。再见 – Sudarshan 2014-09-03 13:49:08