![](/img/trans.png)
[英]How to get keys (path to) the deepest nested object in a javascript nested object
[英]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.