代码之家  ›  专栏  ›  技术社区  ›  Chris

js get对象中父键的名称[closed]

  •  0
  • Chris  · 技术社区  · 7 年前

    {
       name: 'Jon',
       address: {
            city: 'Vienna',
            parent: <How can I dynamically set this to 'address'>
       }
    }
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Amit Wagner    7 年前

    const obj = {
       name: 'Jon',
       address: {
            city: 'Vienna'
       }
    }
    
    for(let i in obj){
    	if(typeof obj[i] === 'object'){
        	obj[i].parent = i;
        }
    }
    console.log(obj)
        2
  •  0
  •   amrender singh    7 年前

    我们可以通过创建一个递归函数来实现这一点,该函数使用parent属性递归地更新对象和子对象中的所有级别。 这是一个递归函数,它将适用于n级。

    var obj = {
       name: 'Jon',
       address: {
            city: 'Vienna',
            pincode :{
              val : 110,
              Area : {
                val : "xyz"
              }
            },
       },
       designation : {
          post : "Manager",
          salary : {
             value : "100"
          }
       }
    }
    
    function updateParent(obj,parent){
      if(parent)
        obj.parent = parent;
      for(var key in obj){
        if(obj[key].constructor.toString().indexOf("Object") >= 0){
            updateParent(obj[key],key);
        }
      }
    }
    updateParent(obj);
    console.log(obj);
        3
  •  0
  •   Tom O.    7 年前

    我采用的方法是使对象可移植,然后使用 for...of 要搜索所需的子属性并将值更改为其父对象的名称,请执行以下操作:

    var data = {
      name: 'Jon',
      address: {
        city: 'Vienna',
        parent: '<How can I dynamically set this to \'address\'>'
      }
    };
    
    data[Symbol.iterator] = function() {
      var i = 0;
      var keys = Object.keys(this);
      return {
        next: function() {
          var value = keys[i],
            done = false;
          i++;
    
          if (i > keys.length) {
            done = true;
          }
    
          return {
            value,
            done
          }
        }
      }
    }
    
    function setChildProperty(parentPropertyName, childPropertyName) {
      for (prop of data) {
        if (prop == parentPropertyName) {
          data[prop][childPropertyName] = prop;
        }
      }
    }
    
    //Before
    console.log(data);
    setChildProperty("address", "parent")
    //After
    console.log(data);