对于属性值数组,使用什么代替Underscore.js ._ where()

时间:2014-08-17 19:24:21

标签: underscore.js

我们说我们有以下数据:

[
 {
      "name": "Experiment type10",
      "scale": ["Whole Brain", "Cell"],
      "datatype": "table"
 },
 {
     "name": "Experiment type11",
     "scale": ["Tissue", "Cell"],
     "datatype": "image"
 },
 {
     "name": "Experiment type12",
     "scale": "Tissue",
     "datatype": "text"
 }
]

使用下划线._where我可以使用数据类型" text"过滤掉对象,但是我无法过滤掉所有对象,其等级为"纸巾" ;因为它在一个数组中。是否可以优雅地进行这种类型的过滤?

2 个答案:

答案 0 :(得分:2)

使用filtercontains

    var hasTissues = function(item){
        return item.scale === 'Tissue' || _.contains(item.scale, 'Tissue');
    }

    var tissues = _.filter(list, hasTissues);

答案 1 :(得分:2)

_.where只是通用_.filter的捷径。 _.filter使用谓词函数而不是简单的属性列表:

_(array).filter(function(h) {
    if(h.datatype !== 'text')
        return false;
    if(_(h.scale).isArray())
        return _(h.scale).indexOf('Tissue') !== -1;
    return h.scale === 'Tissue';
});

有多种方法可以检查h.scale是否包含'Tissue':您可以使用简单的for - 循环代替_.indexOf,您可以使用{ {1}}代替typeof,您可以说_.isArray并检查数组a = _([ h.scale ]).flatten(),...

演示:http://jsfiddle.net/ambiguous/umwf348k/