json数据怎么根据ID找索引值


  { 
   id: 1, 
   childNode: [ 
        {  
          id: 2, 
          name: '哈哈哈’ 
        } 
     ] 
  }, 
  { 
    id: 3,  
    childNode: [ 
        {  
          id: 4, 
          name: '哈哈哈’ 
        } 
     ] 
   } 
]

如果传入一个id = 2,那么返回他的父级索引值,加上他自己的索引

如果传入一个id = 1,那么返回他自己的索引,他子节点索引为空      
 怎么写个递归呢

function indexesOf(data, id) {
    for(let i = 0;i<data.length;i++) {
    const item = data[i];
    if(item.id == id) return [i];
    if(item.childNode) {
      const childIndexes = indexesOf(item.childNode, id);
      if(childIndexes) return [i].concat(childIndexes);
    }
  }
}

 vue中的使用

  // 当前选中的节点的index,如果当前点击节点的id是容器的子节点,那么就返回父级节点的索引,加上容器的子节点索引
    activeElementIndex (state) {
      // 根据ID找索引值
      function indexesOf (data, id) {
        for (let i = 0; i < data.length; i++) {
          const item = data[i]
          if (item.uuid === id) return [i]
          if (item.childNode && item.childNode.length > 0) {
            const childIndexes = indexesOf(item.childNode, id)
            if (childIndexes) return [i].concat(childIndexes)
          }
        }
      }
      return indexesOf(state.projectData.elements, state.activeElementUUID)
    },
    // 根据子节点的id获取父节点的信息
    getParentInfo: (state) => (id) => {
      // 根据ID找父节点的id
      function findParentId (data, id) {
        let result
        if (!data) return
        for (let i = 0; i < data.length; i++) {
          const item = data[i]
          if (item.uuid === id) {
            result = item
            // 找到id相等的则返回父节点
            return result
          } else if (item.childNode && item.childNode.length > 0) {
            // 如果有子集,则把子集作为参数重新执行本方法
            result = findParentId(item.childNode, id)
            if (result) {
              return data[i]
            }
          }
        }
      }
      return findParentId(state.projectData.elements, id)
    }
原文地址:https://www.cnblogs.com/plBlog/p/12439153.html