通过点表示的字符串键遍历对象

时间:2019-03-12 04:22:08

标签: javascript object key

我不确定为什么这样做。它似乎可以达到我的期望,但是我不确定它是如何工作的。有人可以解释如何在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;
}

1 个答案:

答案 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;
}