как получить ключи вложенного объекта - PullRequest
0 голосов
/ 24 апреля 2018

Если у меня плоский объект, то это работает:

 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 

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Похоже, что вы можете сделать это с помощью небольшой рекурсивной функции:

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)
0 голосов
/ 24 апреля 2018
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);
      }
    });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...