在深度为2级的对象集合上加下划线过滤

Underscorejs filter on collection of object 2 levels deep

本文关键字:下划线 过滤 集合 对象 深度 2级      更新时间:2023-09-26

我有一个对象数组,它包含一个对象数组,它包含一个对象数组。

我要做的是对最后一个对象数组中的属性进行筛选。

下面是一个示例数据集

    var sampleData=[
   {
      "name":"Cooking",
      "shelve":[
         {
            "name":"Shelve 1",
            "drawers":[
               {                  
                  "Name":"Left"
               },
               {
                  "Name":"Middle"
               }
            ]
         },
         {
            "name":"Shelve 2",
            "drawers":[
               {
                  "Name":"Middle side"
               },
               {
                  "Name":"Left"
               },
               {
                  "Name":"Up"
               }
            ]
         }
      ]
   },
   {
      "name":"DBs",
      "shelves":[
         {
            "name":"Shelve 3",
            "drawers":[
               {
                  "Name":"asdfasdf"
               },
               {
                  "Name":"New Test 12"
               }
            ]
         }
      ]
   }
];

基本上我想要做的是能够得到的对象,其中抽屉。name包含子字符串。我想让它返回完整的对象图所以如果我搜索Middle,我期望返回

var sampleData=[
   {
      "name":"Cooking",
      "shelve":[
         {
            "name":"Shelve 1",
            "drawers":[
               {
                  "Name":"Middle"
               }
            ]
         },
         {
            "name":"Shelve 2",
            "drawers":[
               {
                  "Name":"Middle side"
               }
            ]
         }
      ]
   }
];

我希望使用下划线会有所帮助,我最初只是尝试嵌套过滤器,但没有工作。

我尝试了以下操作,虽然find在应该的时候会计算为true,但它不会像我希望的那样过滤。

var secs = _.filter(sampleData, function(section) {
                _.filter(section.shelve, function(shelve) {
                    _.filter(shelve.drawers, function(drawer) {
                        var found = drawer.Name.indexOf('Middle') !== -1;
                        if(found) {
                            var xa = 'found it!!';
                        }
                        return drawer.Name.indexOf('Middle') !== -1;
                    });
                }); 
            });

下面是一个快速的jsfiddler示例。http://jsfiddle.net/cnalk/GtfNj/3/

不幸的是,像_.filter这样的基本数组过滤器不提供两步过滤的方法(首先,通过数组的值;然后是通过多少个值),因此您需要为每个层编写自己的过滤函数,例如:

function filter_shelf( shelf ) {
    var filtered = _.omit( shelf, 'drawers' );
    filtered.drawers = _.filter( shelf.drawers, filter_drawer );
    return filtered.drawers.length && filtered;
}

完整的小提琴:http://jsfiddle.net/GtfNj/5/

每一步都考虑它需要过滤的属性,通过"下面"的步骤过滤它,然后返回它自己或false的过滤副本,如果属性最终从过滤器中为空。然后,它根据该结果对"上面"的步骤进行过滤。等等…

p。您的样本数据不一致地使用shelveshelves