使用Underscore过滤 - 根和子

时间:2014-09-05 20:41:57

标签: javascript underscore.js

嗯,对于经验丰富的人来说,这可能是非常基础的。这是我第一次用下划线。我是这个json。

{
    "especiais" : {
        "text" : {
            "pt" : "Especiais"
        },
        "active" : true
    },
    "conjuntos" : {
        "text" : {
            "pt" : "Conjuntos"
        },
        "active" : true,
        "subItems" : {
            "saiaEcamiseta" : {
                "text" : {
                    "pt" : "Saia e Camiseta"
                },
                "active" : true
            },
            "sandalhas" : {
                "text" : {
                    "pt" : "Sandalhas"
                },
                "active" : true
            }
        }
    },
    "macacoes" : {
        "text" : {
            "pt" : "Macacões"
        },
        "active" : true
    },
    "roupasBasicas" : {
        "text" : {
            "pt" : "Roupas Básicas"
        },
        "active" : true,
        "subItems" : {
            "xortes" : {
                "text" : {
                    "pt" : "Xortes"
                },
                "active" : true
            },
            "camiseta" : {
                "text" : {
                    "pt" : "Camisetas"
                },
                "active" : true
            }
        }
    },
    "enxoval" : {
        "text" : {
            "pt" : "Enxoval"
        },
        "active" : true
    }

}

我想只列出itens和subitems的活跃根。所以,在上面的例子中,macacoes和他的孩子将不会被列出,并且Xortes(roupasBasicas的孩子)也不会被列出,如果适用的话,它包括可能的孙子。

我做了第一次尝试:

    result = _und.filter(data.productCategories, function (item) {
        return item && item.active.indexOf(true) != -1;
    });

但它不起作用:(任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

由于缺乏声誉,我不能要求澄清,所以我会尽力为你解答。

var children = [];

//Get all of the subitems that are active so we can merge with the primary result set
_.each(data.pt, function(item){
  if(item.subItems){
    _.each(item.subItems, function(child){
      if(child.active) children.push(child);
    });
  }
}); 

//Gather all active items in the primary result set
var result = _.filter(data.pt, function(item){
  return item.active;
});

//Add each active subItem to our results
_.each(children, function(child){
  result.push(child);
});

以下是我理解的一个问题: http://plnkr.co/edit/qx6U6ZcmcfhqJxmNulzP?p=preview - 看一下script.js,因为它将提供核心实现。

根据我的理解,你想在该pt对象的上下文中收集所有“活动”项目?

如果是这种情况,我通过链接提供的过滤器将没有问题,但您仍然会在父母下方拥有这些项目。

如果需要过滤那些,你可以简单地将那些数据附加到对象的字段(或者如果你选择更聪明的方法)。

_.filter函数似乎最适合这个,因为您可以过滤给定谓词的数据集。我在上述代码中提供的查询的第二部分中的函数根据它们是否处于活动状态来缩小原始数据集的范围。