javascript - JavaScript:参数未传递给函数内部的 Array.forEach => 未定义?
问题描述
const data = {
"desk": {
"drawer": "stapler"
},
"cabinet": {
"top drawer": {
"folder1": "a file",
"folder2": "secrets"
},
"bottom drawer": "soda"
},
"item" : [
{
"hello" : {
"world" : "isHere"
},
"test" : "1"
},
{
"hello" : {
"world" : "isHere2"
},
"test" : "2"
},
]
};
const iterate = (obj) => {
Object.keys(obj).forEach(key => {
if (typeof obj[key] === 'object') {
iterate(obj[key])
} else{
let value = obj[key];
let newObj = {[key]: value, 'style' : {backGroundColor : 'red'}};
delete obj[key];
Object.assign(obj, newObj);
}
})
}
iterate(data);
console.log(data)
我编写了一个递归函数,它应该用我在参数中指定的对象替换每个键值对(不是属性!)。
但是,如果我在函数内使用array.forEach循环,则传递的obj是undefined。
我错过了什么?
例子
const iterate = (obj, newObj) => {
Object.keys(obj).forEach(key => {
if (typeof obj[key] === 'object') {
iterate(obj[key])
} else{
delete obj[key];
Object.assign(obj, newObj);
}
})
}
但是,如果我在 forEach 中定义对象,它会完美运行......
const iterate = (obj) => {
Object.keys(obj).forEach(key => {
if (typeof obj[key] === 'object') {
iterate(obj[key])
} else{
let value = obj[key];
// SEE HERE
let newObj = {[key]: value, 'style' : {backGroundColor : 'red'}};
delete obj[key];
Object.assign(obj, newObj);
}
})
}
为什么Object.keys(obj).forEach在第一个版本中看不到传递的参数?解决方案是什么?
解决方案
newObj
每当您iterate
在Array.forEach()
-内调用时,您都需要通过iterate(obj[key], newObj)
:
const data = {"desk":{"drawer":"stapler"},"cabinet":{"top drawer":{"folder1":"a file","folder2":"secrets"},"bottom drawer":"soda"},"item":[{"hello":{"world":"isHere"},"test":"1"},{"hello":{"world":"isHere2"},"test":"2"}]};
const iterate = (obj, newObj) => {
Object.keys(obj).forEach(key => {
if (typeof obj[key] === 'object') {
iterate(obj[key], newObj)
} else {
// delete obj[key]; // remove for example purposes
Object.assign(obj, newObj);
}
})
}
const newObj = {
'style': {
backGroundColor: 'red'
}
};
iterate(data, newObj);
console.log(data)
推荐阅读
- r - 在用户定义函数中调用 colnames()
- mysql - 如何只选择一个值的前 2 个寄存器?
- javascript - 如何解决这种意外混合的“>>>”和“&”运算符警告?
- c# - 列表
- > 达到内存限制
- cypress - 赛普拉斯:赛普拉斯无法找到边缘
- python - 在本地运行 Pyspark 以访问 S3 中的 parquet 文件错误:“无法从链中的任何提供商加载 AWS 凭证”
- powershell - 如何使用 powershell 自定义日期获得与某个日期的年月差?
- java - 在回调内部的 onResponse 方法中获取传递给改造的查询参数
- javascript - 限制键盘事件对特定组件的影响
- mysql - MYSQL 在输入数据时触发 UPDATE 字段