我不确定为什么这样做。它似乎可以达到我的期望,但是我不确定它是如何工作的。有人可以解释如何在console.log中找到密钥并返回重新映射吗?
const data = {
title: "hello world",
user: {
title: 'ruegen',
app: {
title: 'my app'
}
}
}
const map = {
'user.title': 'Ruegen',
'title': 'Title',
'user.app.title': 'App'
}
Object.keys(map).forEach(function(key) {
const row = ref(data, key)
const header = map[key]
console.log(header, row)
})
function ref(row, key) {
var headers = key.split(".")
var row = JSON.parse(JSON.stringify(row))
headers.forEach(function(header) {
// console.log('>>', header)
try {
row = row[header]
} catch (err) {
return
}
})
return row;
}
答案 0 :(得分:1)
主要工作在ref
函数中完成。您可以删除var row = JSON.parse(JSON.stringify(row))
,它将仍然有效。在该函数中,您将键字符串分割为数组headers
(由key.split(".")
组成),然后在(标题元素的)forEach循环中,通过“ row = row [header]”进入对象行-因此每个迭代时,将行替换为键“标头”处的行值。一切都在try-catch块中完成,因此,如果您输入的密钥无效,则什么也不返回。
在Object.keys(map).forEach
中,您以相同的数据结构但与地图对象使用不同的键来运行ref
。
ref
可以简化为
function ref(row, key) {
key.split(".").forEach(k => row ? row=row[k] : undefined)
return row;
}
其中,我们使用ternary operator通过简单的空检查(这会提高无效密钥的代码速度)来替换try-catch块。和arrow function。
const data = {
title: "hello world",
user: {
title: 'ruegen',
app: {
title: 'my app'
}
}
}
const map = {
'user.title': 'Ruegen',
'title': 'Title',
'user.app.title': 'App'
}
Object.keys(map).forEach(function(key) {
const row = ref(data, key)
const header = map[key]
console.log(header, row)
})
function ref(row, key) {
key.split(".").forEach(k => row ? row=row[k] : undefined)
return row;
}