使用下划线对对象进行角度,深度搜索

时间:2014-12-19 20:33:10

标签: javascript angularjs underscore.js

我正在尝试搜索对象以检查验证,如此

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里面有嵌套对象,例如也有我想要添加到这个数组中的选定键。

1 个答案:

答案 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;
&#13;
&#13;


根据评论中的要求,这里解释了这条线如何运作:

return [el.selected, mapSelections(el.subs || [])];

这主要是滥用功能如何使其更简洁。由于我们最终会将所有内容弄平,无论如何,我们只能返回值本身的数组(el.selected)和递归确定的剩余选择。

然后我们在子项上调用mapSelections来查找子值。问题是,如果元素没有子项(如果项没有subs属性),则会失败。因此,如果||未定义,我们使用JavaScript的逻辑或运算符(el.subs)来提供默认值。这是有效的,因为如果第一个值为false,则运算符总是返回表达式的第二个值。