在不修改对象的情况下使用javascript获取父项

时间:2018-12-08 13:23:37

标签: javascript arrays

我有original个嵌套对象,其中包含巨大的树型结构。这基本上是JSON字符串,可以转换为JavaScript对象。

结构就像-

original = {
       type :  "table",
       children :[
           {
             type : "cell",
             children : [
                {
                   type : "label",
                   children : []
                }
             ]
           }
           {
             type : "cell",
             children : []
           }
       ]
    }

我已将项目选择为-

var select = original.children[1].children[0];

我想要的是获得parent项目中的selected

这是示例演示-https://stackblitz.com/edit/angular-v5m9ua

  

注意:我需要遍历原始对象以找到父对象。我查看了其他答案,但是他们提到了如何设计对象结构以获取父对象,但我不想更改原始对象。

2 个答案:

答案 0 :(得分:1)

您可以使用for...in循环创建递归函数,并返回对象类型的最后一个父元素。

const data = {
  type: "table",
  children: [{
    type: "cell",
    children: [{
      type: "label",
      children: []
    }]
  }, {
    type: "cell",
    children: []
  }]
}
var select = data.children[0].children[0];

function getParent(data, obj, parent = null) {
  let result = null;

  (function loop(data, obj, parent) {
    if (typeof data == 'object' && !Array.isArray(data)) {
      parent = data
    }

    for (let i in data) {
      if (select == data[i]) {
        result = parent;
        break;
      }

      if (typeof data[i] == 'object') {
        loop(data[i], obj, parent)
      }
    }
  })(data, obj, parent)

  return result;
}

let parent = getParent(data, select)
console.log(parent)

答案 1 :(得分:0)

您可以搜索树:

 findParent(root, toFind) {
    for(const child of root.children || []) {
      if(child === toFind){
         return root;
      } 
      const result = this.findParent(child, toFind);
      if(result){
        return result;
      } 
    }
}

可以用作:

  findParent(original, select)