Javascript 递归查找父级的筛选器数组

Javascript 递归查找父级的筛选器数组,javascript,arrays,algorithm,filter,lodash,Javascript,Arrays,Algorithm,Filter,Lodash,我有一个这样的数组: [ {"id":"one","name":"school", "selected": false, "children":[ {"id":"1","name":"school", "selected": false}, {"id":"2","name":"student", "selected": true}, {"id":"3","name":"teacher", "selected": false} ]},

我有一个这样的数组:

[
    {"id":"one","name":"school", "selected": false, "children":[
      {"id":"1","name":"school", "selected": false},
      {"id":"2","name":"student", "selected": true},
      {"id":"3","name":"teacher", "selected": false}
      ]},
      {"name":"two","name":"school", "selected": false, "children":[
      {"id":"1","name":"school", "selected": true},
      {"id":"3","name":"teacher", "selected": false}
      ]},
      {"name":"three","name":"school", "selected": true, "children":[
      {"id":"1","name":"school", "selected": false},
      {"id":"2","name":"student", "selected": false}
      ]}
  ]
如何对该数组进行筛选以仅获取字段select为true的对象的名称

输出应为对象名称的数组:

[student, school, school]
我用lodash试过这个:

_.filter(array, {selected: true}).map(function (division) {
            return array.name;
        });

但这总是返回根对象,而不是子对象中的对象。

您可以迭代并查看所选的所需属性
是否为
true
,推送结果,如果有子对象,则迭代子对象

这与

var data=[{“id”:“one”,“name”:“school”,“selected”:false,“children”:[{“id”:“1”,“name”:“school”,“selected”:false},{“id”:“2”,“name”:“student”,“selected”:true},{“id”:“3”,“name”:“teacher”,“selected”:“false”,“name”:“school”,“selected”:false,“children”:[{“id”:“1”,“name”:“school”,“选定的”:true},{“id”:“3”,“name”:“teacher”,“selected”:“false}]},{“name”:“three”,“name”:“school”,“selected”:“true”,“children”:[{“id”:“1”,“name”:“school”,“selected”:“false},{“id”:“2”,“name”:“student”,“selected”:“false}]}],
结果=[];
数据。forEach(功能iter(o){
o、 选择结果推送(o.name)(&result.push);
(o.children | |[])forEach(国际热核实验堆);
});

console.log(result);
您可以迭代并查看所选的所需属性
是否为
true
,推送结果,如果有子项,则迭代子项

这与

var data=[{“id”:“one”,“name”:“school”,“selected”:false,“children”:[{“id”:“1”,“name”:“school”,“selected”:false},{“id”:“2”,“name”:“student”,“selected”:true},{“id”:“3”,“name”:“teacher”,“selected”:false,{“name”:“school”,“selected”:“children选择:真},{“id”:“3”,“姓名”:“教师”,“选择:假}]},{“姓名”:“三”,“姓名”:“学校”,“选择”:真”,“儿童”:[{“id”:“1”,“姓名”:“学校”,“选择”:假},{“id”:“2”,“姓名”:“学生”,“选择”:假}],
结果=[];
数据。forEach(功能iter(o){
o、 选择结果推送(o.name)(&result.push);
(o.children | |[])forEach(国际热核实验堆);
});

控制台。log(结果);

,你应该考虑你要建立的脚本的复杂性。这是一个嵌套的线性算法(参见),因为你必须触摸数组中的每一个元素来创建新的数据结构,使用<代码>选择的元素,如果数组的大小增加,它会非常慢。

相反,您可能需要修改切换
selected
属性的方法,并将该“selected”对象复制到新的
selectedElements
数组中

但是,如果要求您按要求执行操作,并且您只希望获得唯一的结果,请查看以下内容:

var数据=[
{“id”:“one”,“name”:“school”,“selected”:false,“childs”:[
{“id”:“1”,“name”:“school”,“selected”:false},
{“id”:“2”,“name”:“student”,“selected”:true},
{“id”:“3”,“name”:“teacher”,“selected”:false}
]},
{“name”:“two”,“name”:“school”,“selected”:false,“childs”:[
{“id”:“1”,“name”:“school”,“selected”:true},
{“id”:“3”,“name”:“teacher”,“selected”:false}
]},
{“姓名”:“三”,“姓名”:“学校”,“选定”:正确,“儿童”:[
{“id”:“1”,“name”:“school”,“selected”:false},
{“id”:“2”,“name”:“student”,“selected”:false}
]}
],
选定元素=[];
data.map(功能(第一行){
如果(选定行){
if(selectedElements.indexOf(row.name)=-1)
selectedElements.push(行名称);
}
否则{
row.childs.map(函数(childRow,ii){
if(childRow.selected){
if(selectedElements.indexOf(childRow.name)=-1)
selectedElements.push(childRow.name);
}
})
}
});

控制台。日志(选择项);

,你应该考虑你要建立的脚本的复杂性。这是一个嵌套的线性算法(参见),因为你必须触摸数组中的每一个元素来创建新的数据结构,使用<代码>选择的元素,如果数组的大小增加,它会非常慢。 相反,您可能需要修改切换

selected
属性的方法,并将该“selected”对象复制到新的
selectedElements
数组中

但是,如果要求您按要求执行操作,并且您只希望获得唯一的结果,请查看以下内容:

var数据=[
{“id”:“one”,“name”:“school”,“selected”:false,“childs”:[
{“id”:“1”,“name”:“school”,“selected”:false},
{“id”:“2”,“name”:“student”,“selected”:true},
{“id”:“3”,“name”:“teacher”,“selected”:false}
]},
{“name”:“two”,“name”:“school”,“selected”:false,“childs”:[
{“id”:“1”,“name”:“school”,“selected”:true},
{“id”:“3”,“name”:“teacher”,“selected”:false}
]},
{“姓名”:“三”,“姓名”:“学校”,“选定”:正确,“儿童”:[
{“id”:“1”,“name”:“school”,“selected”:false},
{“id”:“2”,“name”:“student”,“selected”:false}
]}
],
选定元素=[];
data.map(功能(第一行){
如果(选定行){
if(selectedElements.indexOf(row.name)=-1)
selectedElements.push(行名称);
}
否则{
row.childs.map(函数(childRow,ii){
if(childRow.selected){
if(selectedElements.indexOf(childRow.name)=-1)
selectedElements.push(childRow.name);
}
})
}
});

console.log(selectedElements);
在lodash.filter之前添加一行

array = _.flatten(array.map(x => [x].concat(x.childs)))

因此需要
child
在lodash.filter之前添加一行

array = _.flatten(array.map(x => [x].concat(x.childs)))
array
   .reduce((a, i) => [...a, i, ...i.childs], [])//flatten array
   .filter(i => i.selected)//filter with selected===true
   .map(i => i.name));//map to name
因此需要
儿童

array
   .reduce((a, i) => [...a, i, ...i.childs], [])//flatten array
   .filter(i => i.selected)//filter with selected===true
   .map(i => i.name));//map to name
console.log([{
“id”:“一个”,
“名称”:“学校”,
“选定”:false,
“儿童”:[{
“id”:“1”,
“名称”:“学校”,
“选定”:false
}, {
“id”:“2”,
“姓名”:“学生”,
“选定”:真
}, {
“id”:“3”,
“姓名”:“教师”,
“选定