Javascript 子项:空 }, { 名称:“某些产品名称7”, id:'12345678', 数据:[9,5,355764335], 子项:空 } ] } } ] } } ] } }, { 名称:“某子公司名称3”, id:'1234', 数据:空, 儿童:{ 级别:“级

Javascript 子项:空 }, { 名称:“某些产品名称7”, id:'12345678', 数据:[9,5,355764335], 子项:空 } ] } } ] } } ] } }, { 名称:“某子公司名称3”, id:'1234', 数据:空, 儿童:{ 级别:“级,javascript,ecmascript-6,underscore.js,lodash,Javascript,Ecmascript 6,Underscore.js,Lodash,子项:空 }, { 名称:“某些产品名称7”, id:'12345678', 数据:[9,5,355764335], 子项:空 } ] } } ] } } ] } }, { 名称:“某子公司名称3”, id:'1234', 数据:空, 儿童:{ 级别:“级别3”, 项目:[ { 名称:'某个区域名称5', id:'12345', 数据:空, 儿童:{ 级别:“级别4”, 项目:[ { 名称:'某个本地名称5', id:'123456', 数据:空, 儿童:{ 级别:“级别5”, 项目:[ { 名

子项:空 }, { 名称:“某些产品名称7”, id:'12345678', 数据:[9,5,355764335], 子项:空 } ] } } ] } } ] } }, { 名称:“某子公司名称3”, id:'1234', 数据:空, 儿童:{ 级别:“级别3”, 项目:[ { 名称:'某个区域名称5', id:'12345', 数据:空, 儿童:{ 级别:“级别4”, 项目:[ { 名称:'某个本地名称5', id:'123456', 数据:空, 儿童:{ 级别:“级别5”, 项目:[ { 名称:“某些产品名称8”, id:'1234567', 数据:[2,35,235,35554,554], 子项:空 } ] } } ] } } ] } } ] } } ] }; 常数arr=[]; 函数getMatch(数据、过滤器){ if(数据和数据项长度){ 让我们看看这个项目; 对于(设i=0,j=data.items.length;iconst data = { level : 'Level 1', items : [ { name : 'Some Business Name', id : '123', data : null, child : { level : 'Level 2', items : [ { name : 'Some Sub-Business Name', id : '1234', data : null, child : { level : 'Level 3', items : [ { name : 'Some Area Name', id : '12345', data : null, child : { level : 'Level 4', items : [ { name : 'Some Local Name', id : '123456', data : null, child : { level : 'Level 5', items : [ { name : 'Some Product Name', id : '1234567', data : [2, 35, 235, 35554, 55554], child : null }, { name : 'Some Product Name 2', id : '12345678', data : [9, 5, 35, 5764, 335], child : null } ] } }, { name : 'Some Local Name 2', id : '123456', data : null, child : { level : 'Level 5', items : [ { name : 'Some Product Name 3', id : '1234567', data : [2, 35, 235, 35554, 55554], child : null }, { name : 'Some Product Name 4', id : '12345678', data : [9, 5, 35, 5764, 335], child : null } ] } } ] } }, { name : 'Some Area Name 2', id : '12345', data : null, child : { level : 'Level 4', items : [ { name : 'Some Local Name 3', id : '123456', data : null, child : { level : 'Level 5', items : [ { name : 'Some Product Name 5', id : '1234567', data : [2, 35, 235, 35554, 55554], child : null } ] } } ] } } ] } } ] } }, { name : 'Some Business Name 2', id : '123', data : null, child : { level : 'Level 2', items : [ { name : 'Some Sub-Business Name 2', id : '1234', data : null, child : { level : 'Level 3', items : [ { name : 'Some Area Name 3', id : '12345', data : null, child : { level : 'Level 4', items : [ { name : 'Some Local Name 4', id : '123456', data : null, child : { level : 'Level 5', items : [ { name : 'Some Product Name 6', id : '1234567', data : [2, 35, 235, 35554, 55554], child : null }, { name : 'Some Product Name 7', id : '12345678', data : [9, 5, 35, 5764, 335], child : null } ] } } ] } } ] } }, { name : 'Some Sub-Business Name 3', id : '1234', data : null, child : { level : 'Level 3', items : [ { name : 'Some Area Name 5', id : '12345', data : null, child : { level : 'Level 4', items : [ { name : 'Some Local Name 5', id : '123456', data : null, child : { level : 'Level 5', items : [ { name : 'Some Product Name 8', id : '1234567', data : [2, 35, 235, 35554, 55554], child : null } ] } } ] } } ] } } ] } } ] }; const arr = []; function getMatch(data, filters) { if (data && data.items.length) { let _thisItem; for (let i = 0, j = data.items.length; i < j; i += 1) { _thisItem = data.items[i]; for (let x = 0, y = filters.length; x < y; x += 1) { if (_thisItem.name === filters[x]) { arr.push(_thisItem); } } if (_thisItem.child) { getMatch(_thisItem.child, filters); } } } } const filterList = [ ['Some Business Name', 'Some Business Name 2'], ['Some Sub-Business Name', 'Some Sub-Business Name 2'], ['Some Area Name', 'Some Area Name 3'], ['Some Local Name 2', 'Some Local Name 4'] ]; getMatch(data, [].concat(...filterList)); console.log(arr) /* Output: 0: {name: "Some Business Name", id: "123", data: null, child: {…}} 1: {name: "Some Sub-Business Name", id: "1234", data: null, child: {…}} 2: {name: "Some Area Name", id: "12345", data: null, child: {…}} 3: {name: "Some Local Name 2", id: "123456", data: null, child: {…}} 4: {name: "Some Business Name 2", id: "123", data: null, child: {…}} 5: {name: "Some Area Name 4", id: "12345", data: null, child: {…}} 6: {name: "Some Local Name 4", id: "123456", data: null, child: {…}} Would like to see eventually: { level : 'Level 1', items : [ { name : 'Some Business Name', id : '123', data : null, child : { level : 'Level 2', items : [ { name : 'Some Sub-Business Name', id : '1234', data : null, child : { level : 'Level 3', items : [ { name : 'Some Area Name', id : '12345', data : null, child : { level : 'Level 4', items : [ { name : 'Some Local Name', id : '123456', data : null, child : null // removed because only the immediate parent was selected, but not this item }, { name : 'Some Local Name 2', id : '123456', data : null, child : { level : 'Level 5', items : [ { name : 'Some Product Name 3', id : '1234567', data : [2, 35, 235, 35554, 55554], child : null }, { name : 'Some Product Name 4', id : '12345678', data : [9, 5, 35, 5764, 335], child : null } ] } } ] } }, { name : 'Some Area Name 2', id : '12345', data : null, child : null // removed because only the immediate parent was selected, but not this item } ] } } ] } }, { name : 'Some Business Name 2', id : '123', data : null, child : { level : 'Level 2', items : [ { name : 'Some Sub-Business Name 2', id : '1234', data : null, child : { level : 'Level 3', items : [ { name : 'Some Area Name 3', id : '12345', data : null, child : { level : 'Level 4', items : [ { name : 'Some Local Name 4', id : '123456', data : null, child : { level : 'Level 5', items : [ { name : 'Some Product Name 6', id : '1234567', data : [2, 35, 235, 35554, 55554], child : null }, { name : 'Some Product Name 7', id : '12345678', data : [9, 5, 35, 5764, 335], child : null } ] } } ] } } ] } }, { name : 'Some Sub-Business Name 3', id : '1234', data : null, child : null // removed because only the immediate parent was selected, but not this item } ] } } ] }; */
  function findPathBFS(source, goal) {
  const dataSource = JSON.parse(JSON.stringify(source))
  const res = []
  res.push(...dataSource)
  for (let i = 0; i < res.length; i++) {
    res[i].num = i
  }
  for (let i = 0; i < res.length; i++) {
    const curData = res[i]
    if (curData.name === goal) {
      const result = []
      return (function findParent(data) {
        result.unshift({name:data.name,num:data.num});
        if (data.parent) return findParent(data.parent)
        return result
      })(curData)
    }
    if (curData.child) {
      res.push(...curData.child.items.map((d,i) => {
        d.parent = curData;
        d.num = i;
        return d
      }))
    }
  }
  return []
}


let array = findPathBFS(data.items, 'Some Area Name 3');
console.log(array);

const newData = prune();
console.log(newData)

function prune(){
    let count=0;
    const currentData = JSON.parse(JSON.stringify(data));
    const items = currentData.items;
    const arr = array.map(e=>e.num);
    _prune(items,count,arr);
    return currentData;
}
function _prune(items,count,arr){
    const item = JSON.parse(JSON.stringify(items[arr[count]]));
    items.length=1;
    items[0]=item;
    count++;
    if(count<arr.length){
        _prune(items[0].child.items,count,arr)
    }
    if(count===arr.length){            
        if(items[0]&&items[0].child){
            for(let _item in items[0].child.items){
                _item.child=null;
            }
        }
    }
}
// not sure why did you need a two-dimensional array here.
const filterList = [
  'Some Business Name',
  'Some Business Name 2',
  'Some Sub-Business Name',
  'Some Sub-Business Name 2',
  'Some Area Name',
  'Some Area Name 3',
  'Some Local Name 2',
  'Some Local Name 4',
];
// filter by name
let arr = _.filterDeep( data,
  (item, key, parentVal, ctx) => {
    return (_.includes(filterList, item.name) ||
      (ctx.parent &&
        _.includes(filterList, _.get(ctx, 'parent.parent.parent.value.name')))
    );
  },
  { tree: { children: 'items' } }
);
// remove empty 'child'
arr = _.filterDeep( arr,
  (val, key) => {
    return key != 'child' || (val !== null && val.items.length > 0);
  },
  { leavesOnly: false, onTrue: { skipChildren: false } }
);