我正在尝试搜索对象以检查验证,如此
var selLess = $scope.accountTreeHere.map( function(obj){
return obj.selected;
});
所以这个工作正常但是,实际上有一个更深层次的项目有.selected我想要合并到这个变量中,这个地图似乎只是在accountTreeHEre的第一层,当我需要它时进入任何级别寻找所选的关键。这可能是下划线吗?我是新手,因此我仍然不确定如何做到这一点。
我基本上想要使用所选键的任何内容映射整个对象,无论多深,并返回其值的数组。
感谢阅读!
所以accountTreeHere会看起来像这样
[{name : name 1, selected: true, subs : [{selected : true, name : sub 1},{selected : false, name : sub 2}]},{name : name 2, selected: false, subs : [{selected : false, name : sub 1},{selected : false, name : sub 2}]}
所以它只是在sub里面有嵌套对象,例如也有我想要添加到这个数组中的选定键。
答案 0 :(得分:2)
您可以使用_.map
和_.flatten
的组合来做到这一点而不会有太多麻烦。
var data = [
{ name: "name 1", selected: true, subs:
[
{ selected: true, name: "sub 1" },
{ selected: false, name: "sub 2" }
]},
{ name: "name 2", selected: false, subs:
[
{ selected: false, name: "sub 1" },
{ selected: false, name: "sub 2" }
]}
];
function mapSelections(data) {
return _.map(data, function (el) {
return [el.selected, mapSelections(el.subs || [])];
});
}
var selLess = _.flatten(mapSelections(data));
console.log(selLess);
document.write(JSON.stringify(selLess));

<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"></script>
&#13;
根据评论中的要求,这里解释了这条线如何运作:
return [el.selected, mapSelections(el.subs || [])];
这主要是滥用功能如何使其更简洁。由于我们最终会将所有内容弄平,无论如何,我们只能返回值本身的数组(el.selected
)和递归确定的剩余选择。
然后我们在子项上调用mapSelections
来查找子值。问题是,如果元素没有子项(如果项没有subs
属性),则会失败。因此,如果||
未定义,我们使用JavaScript的逻辑或运算符(el.subs
)来提供默认值。这是有效的,因为如果第一个值为false,则运算符总是返回表达式的第二个值。