gpt4 book ai didi

javascript - JS 对象嵌套功能有效,但不知道为什么

转载 作者:行者123 更新时间:2023-12-03 04:52:33 25 4
gpt4 key购买 nike

所以我和一位同事一起工作,他向我展示了如何解决一个特定的问题:如何将平面对象放入嵌套对象中。对象属性的命名方式使得它们可以被分割成相关的命名键,然后嵌套。他的解决方案工作得很好,但是当我后来自己运行他的代码时,我无法理解它是如何工作的。

我本质上是获取一个 Excel 工作表并从中创建 json,但为了论证起见,我将删除 Excel 部分并仅添加来自 Excel 解析器的示例结构:

//Example data
var result = {
frame1.title: "heading",
frame1.division: "first",
frame1.data[0].month: "Jan",
frame1.data[0].value: "54",
}


function deepInsert (o, path, value) {
let next, cur = o
path.forEach((p,i) => {
next = cur[p]
if (i == path.length -1) {
cur[p] = value
} else {
if (!next) {
next = cur[p] = {}
}
cur = next
}
})
}
function processWorkbook () {

const result = json.map(item => {
var o = {foo: "bar"}
Object.keys(item).forEach(prop => {
deepInsert(o, prop.split('.'), item[prop])
console.log(JSON.stringify(o, 0, ' '));

})
return o
})

console.log(JSON.stringify(result, 0, ' '))
}

据我所知,他似乎传入了“o”,这是一个空白对象,然后 deepInsert 函数中的循环将数据分配给调用函数中的对象而不是参数,因为每次通过循环中,我的控制台日志显示更多内容被添加到对象中。

我也不明白这部分:next = cur[p] = {}。由于某种原因,三重赋值会在 chrome repl 中引发错误,但不会在该函数中引发错误?我只是很困惑,任何帮助都会很棒!

最佳答案

函数deepInsert接收以下参数:

  • 一个对象(将被修改)
  • 值的路径数组( 'foo.bar.x' 需要变为 ['foo','bar', 'x'] )
  • 要插入的值

并执行以下操作:

  1. 迭代路径数组
  2. 如果当前路径迭代不是最后一次,它将初始化
    其上的新对象。
  3. 如果当前路径是最后一个路径,则将传递的值设置为其。

函数processWorkbook只需迭代对象键即可将参数发送到 deepInsert功能。这可以直接在 deepInsert 上完成。 .

就是这样。问题是该函数有未使用的变量和复杂的代码。更简单且有文档记录的函数:

function unnestObject(obj = {}) {

let newObject = {}, //The object to return

current; // the object position holder

for (var key in obj) { // iterate on recived object keys

current = newObject // Makes the current object the new Object root

let path = key.split('.') // Split the current key

path.forEach((p, i) => { // iterate on the key paths

if ((path.length - 1) !== i) //if the path isn't the last one

current[p] = current[p] || {} // initialize a new object on that path (if a object was previously initialized, it is preserved)

else //if the path is the last one

current[p] = obj[key] // sets the value of the initial object key

current = current[p] // Updates the current to the next node

})
}
return newObject; //returns the new object
}

//Example data [DOESNT WORK WITH ARRAYS]
var data = {
"frame1.title": "heading",
"frame1.division": "first",
"frame1.data.month": "Jan",
"frame1.data.value": "54",
}

console.log(unnestObject(data))
// Prints
// {
// "frame1": {
// "title": "heading",
// "division": "first",
// "data": {
// "month": "Jan",
// "value": "54"
// }
// }
// }

注意:如果您传递类似 {"foo.bar[0].value": 42} 的内容,这两个函数都不支持数组。 , foo.bar将是一个对象。您可以检测数组 []键并使其在迭代时初始化一个数组而不是一个对象

<小时/>

关于next = cur[p] = {} ,您可以一次将一个值分配给多个变量。你可以做foo = bar = 42 ,两者都有 42。您还可以foo = bar = {} 。两者都将具有指向同一对象的指针,如果您更改其中一个对象的值,则另一个对象将已经发生更改。

这对于获取和初始化全局值非常有用

var foo = window.foo = window.foo || {bar: 42};

此行将生成 foowindow.foowindow.foo 上接收对象。如果window.foo尚未初始化,它将接收新对象。

关于javascript - JS 对象嵌套功能有效,但不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42592469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com