Javascript 在树中查找元素并将其更改';s的父母';属性值

Javascript 在树中查找元素并将其更改';s的父母';属性值,javascript,algorithm,recursion,tree,Javascript,Algorithm,Recursion,Tree,我想通过属性值在树中找到一个元素,然后返回到树的开头,并使用JS将每个元素的父元素的isExpanded属性设置为true 所以我有一个目标: elementsArray = [ { name: 'test_1', isExpanded: false, expandElements: [ { name: 'test_1_1', isExpanded: false, expandElements: [

我想通过属性值在树中找到一个元素,然后返回到树的开头,并使用JS将每个元素的父元素的
isExpanded
属性设置为
true

所以我有一个目标:

elementsArray = [
  {
    name: 'test_1',
    isExpanded: false,
    expandElements: [
      {
        name: 'test_1_1',
        isExpanded: false,
        expandElements: [
          {
            name: 'test_1_1_1'
          },
          {
            name: 'test_1_1_2'
          }
        ]
      },
      {
        name: 'test_1_2',
        isExpanded: false,
        expandElements: [
          {
            name: 'test_1_2_1'
          },
          {
            name: 'test_1_2_2'
          }
        ]
      }
    ]
  },
  {
    name: 'test_2',
    isExpanded: false,
    expandElements: [
      {
        name: 'test_2_1',
        isExpanded: false,
        expandElements: [
          {
            name: 'test_2_1_1'
          },
          {
            name: 'test_2_1_2'
          }
        ]
      },
      {
        name: 'test_2_2',
        isExpanded: false,
        expandElements: [
          {
            name: 'test_2_2_1'
          },
          {
            name: 'test_2_2_2'
          }
        ]
      }
    ]
  }
]
我想找到元素,它的属性
名称为:“test_2_2_1”
,并将每个父元素的
isExpanded
属性设置为true

工作原理:

  • 调用一个方法
    expandParentElements(elementsArray,'test_2_2_1')
  • elementsArray
    更改为:
到现在为止,我只在树中递归地移动并找到合适的元素。下面是它的样子:

let expandParentElements = (array, searchName) => {
  return array.map(item => {
    if (item.name === searchName) {
      return item
    } else if (item.expandElements) {
      return expandParentElements(item.expandElements, searchName)
    }
  })
}

下面是一个函数,用于设置项目路径上的
isExpanded
。项本身(例如,当它有子项时)将不会将
isExpanded
设置为true

此函数也不会在调用函数之前清除可能已设置为
true
isExpanded

const expandParentElements=(数组,searchName)=>
array&&array.some(item=>item.name==searchName||
expandParentElements(item.expandElements,searchName)&&(item.isExpanded=true)
);
//问题的样本数据
const elementsArray=[{name:'test_1',isExpanded:false,expandElements:[{name:'test_1_1',isExpanded:false,expandElements:[{name:'test_1_1_1'},{name:'test_1_1_2'},{name:'test test u 1_1_1_2'},{false,isexpandelements:[{name:'test name:'test u 1_1_2_2'},{[{name:'test_2_1',isExpanded:false,expandElements:[{name:'test_2_1_1'},{name:'test_2_1'}],{name:'test_2_2',isExpanded:false,expandElements:[{name:'test u 2_2_1'},{name:'test u 2_2'}]}];
expandParentElements(elementsArray,“test_2_2_1”);

console.log(elementsArray);
欢迎来到StackOverflow。如果您能提供一些代码来说明您试图解决问题的方法,那就太好了。@RDev,谢谢您的提示。我已经更新了帖子。
let expandParentElements = (array, searchName) => {
  return array.map(item => {
    if (item.name === searchName) {
      return item
    } else if (item.expandElements) {
      return expandParentElements(item.expandElements, searchName)
    }
  })
}
elementsArray.forEach(element => {

  let updateParent =  element.expandElements.reduce(((prevFound, expandElement) => {

      let found = expandElement.expandElements.some(obj => obj.name === "test_1_1_1")
      expandElement.isExpanded = found
      return prevFound || found

  }), false)

  element.isExpanded = updateParent

})