在深度为2级的对象集合上加下划线过滤
Underscorejs filter on collection of object 2 levels deep
我有一个对象数组,它包含一个对象数组,它包含一个对象数组。
我要做的是对最后一个对象数组中的属性进行筛选。
下面是一个示例数据集
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。您的样本数据不一致地使用shelve
或shelves
相关文章:
- es6 相当于下划线查找位置
- 用空格替换下划线PHP
- 如何使用下划线js转换这些数据
- 带嵌套json的下划线js查找
- 如何逃离<>在javascript下划线模板中
- TinyMCE从MSWord粘贴的文本在所有文本下加下划线
- 使用lodash下划线基于键拆分jsonarray
- 在控制台中显示下划线变量
- 如何从另一个带下划线的数组中筛选带元素的数组
- 是否可以使用下划线按多个值过滤数组值
- 使用下划线.js过滤多维数组
- 使用过滤器和下划线过滤对象数组
- 下划线.js阵列过滤
- 如何使用下划线过滤json数据
- 当使用''时,下划线过滤掉' 0 '值
- 下划线过滤对象
- 下划线_.过滤条件
- 如何过滤所有特殊字符(下划线旁边)显示允许和不允许
- 按带有下划线的属性值过滤重复的集合对象(不区分大小写和修剪)
- 在深度为2级的对象集合上加下划线过滤