繁体   English   中英

如何获取嵌套对象的键

[英]how to get keys of nested object

如果我有一个平坦的物体,那么这可行:

 let stateCopy={...this.state}

 Object.entries(dictionary).map(([key,value])=>{
 stateCopy.key = value.toString())
 })

如果字典包含嵌套对象,有没有办法做到这一点。 假设字典如下:

dictionary={left:{name:'WORK',
                  min:2,
                  sec:0,}
            start:true}

我需要某种方式来更新stateCopy,即

stateCopy.left.name='WORK' 
stateCopy.left.min=2 
stateCopy.left.sec=0 
stateCopy.start=true 
function flattenDictionary(dict) {
  if (!dict) {
    return {};
  }

  /** This will hold the flattened keys/values */
  const keys = {};

  // Perform the flatten
  flattenH(dict);

  return keys;

  function flattenH(obj, prefix) {
    Object.keys(obj).forEach((key) => {
      const val = obj[key];

      /** This is what we pass forward as a new prefix, or is the flattened key */
      let passKey;
      // Only expect to see this when the original dictionary is passed as `obj`
      if (!prefix || prefix === '') {
        passKey = key;
      } else {
        // "Ignore" keys that are empty strings 
        passKey = ((key === '') ? prefix : `${prefix}.${key}`);
      }

      if (typeof obj[key] !== 'object') {
        keys[passKey] = val;
      } else {
        flattenH(val, passKey);
      }
    });
  }
}

似乎您可以使用一些递归函数来做到这一点:

 let state = { left:{ start: "mark", anotherLevel: { test: 'leveltest' } }, test: "will be replaced" } let dictionary={ test2: { foo: 'bar' }, left:{ name:'WORK', min:2, sec:0, anotherLevel: { test_add: 'leveltest_add' } }, start:true, test: 'replaced with me' } let stateCopy={...state} function merge(obj, dict){ Object.entries(dict).forEach(([k, v]) =>{ if (!obj[k] || typeof v !== 'object') obj[k] = v else merge(obj[k], v) }) } merge(stateCopy, dictionary) console.log(stateCopy) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM