Javascript 通过点符号字符串键遍历对象

Javascript 通过点符号字符串键遍历对象,javascript,object,key,Javascript,Object,Key,我不知道为什么会这样。它似乎达到了我的预期,但我不确定它是如何工作的。有人能解释一下它是如何在console.log中找到密钥并返回remap的吗 const数据={ 标题:“你好,世界”, 用户:{ 标题:“鲁根”, 应用程序:{ 标题:“我的应用程序” } } } 常数映射={ “user.title”:“Ruegen”, “标题”:“标题”, 'user.app.title':'app' } Object.key(map).forEach(function(key){ 常量行=ref(数

我不知道为什么会这样。它似乎达到了我的预期,但我不确定它是如何工作的。有人能解释一下它是如何在console.log中找到密钥并返回remap的吗

const数据={
标题:“你好,世界”,
用户:{
标题:“鲁根”,
应用程序:{
标题:“我的应用程序”
}
}
}
常数映射={
“user.title”:“Ruegen”,
“标题”:“标题”,
'user.app.title':'app'
}
Object.key(map).forEach(function(key){
常量行=ref(数据,键)
const header=映射[键]
console.log(标题,行)
})
功能参考(行、键){
var headers=key.split(“.”)
var row=JSON.parse(JSON.stringify(row))
headers.forEach(函数(header){
//console.log(“>>”,标题)
试一试{
行=行[标题]
}捕捉(错误){
返回
}
})
返回行;

}
主要工作在
ref
功能中完成。您可以remve
var row=JSON.parse(JSON.stringify(row))
它仍然可以工作。在该函数中,您将键字符串拆分为数组
(按
键.split(“.”
),然后在forEach循环(标题元素)中,您按“row=row[header]”进入对象行,因此在每次迭代中,您都将行替换为键“header”处的值。所有操作都是在try-catch块中完成的,所以如果密钥无效,则不返回任何内容

Object.keys(map.forEach
中,您使用与map对象相同的数据结构但不同的键运行
ref

ref
可以简化为

function ref(row, key) {
  key.split(".").forEach(k => row ? row=row[k] : undefined)
  return row;
}
在这里,我们使用简单的空检查(提高无效密钥的代码速度)替换try-catch块。和

const数据={
标题:“你好,世界”,
用户:{
标题:“鲁根”,
应用程序:{
标题:“我的应用程序”
}
}
}
常数映射={
“user.title”:“Ruegen”,
“标题”:“标题”,
'user.app.title':'app'
}
Object.key(map).forEach(function(key){
常量行=ref(数据,键)
const header=映射[键]
console.log(标题,行)
})
功能参考(行、键){
key.split(“.”).forEach(k=>row?row=row[k]:未定义)
返回行;

}
谢谢!这确实缩短了时间。如果我不深度复制行,它不会变异对象吗?@Ruegen它不会变异行(和键)只是好奇,如果它是一个对象并通过引用传递-它怎么不是?
row
只是引用,所以通过
ref=…
您只更改引用(但不更改对象内容)。在js控制台
vara={'x':2},f=函数(b){b=b.x;返回b};控制台日志(f(a));控制台日志(a)