作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目标:
我正在使用 AngularJS 和 Lodash 开发一个应用程序。我需要一个执行以下转换的函数:
来自
{
a: 0,
b: {x: {y: 1, z: 2}},
c: 3
}
进入
{
a: 0,
'b.x.y': 1,
'b.x.z': 2,
c: 3
}
现在,我正在使用递归函数来遍历对象。目前,我的代码看起来像这样(不完整):
var obj = {},
keys, property, value;
var recur = function (mat) {
keys = Object.keys(mat);
for (var i = 0; i < keys.length; i++) {
property = keys[i];
value = mat[property];
if (isObj(value)) {
//debugger;
recur(value);
} else {
obj[property] = value;
}
}
}
recur({
a: 0,
b: {x: {y: 1, z: 2}},
c: 3
});
console.log(obj);
function isObj(value) {
return typeof value === "object";
}
我在调试时遇到的一个问题是:
i 没有增加;在最高层递归调用期间,i 保持为 0。
有人知道为什么吗?如果您知道进行此转换的任何其他方法,请分享。
亲切的问候。
最佳答案
这是因为 keys
在错误的范围内声明。它应该在内部recur
声明。因为事实并非如此,当 recur
递归时,keys
会被覆盖。
这并不会使 i
不会增加,但这确实意味着您的循环将在令人惊讶的时间终止,因为 key
在递归时会发生变化。
property
和 value
也应该在 recur
中声明;一般来说,尽可能在最里面的作用域中声明变量。 (temp
根本不需要声明,因为您从不使用它。)
为了得到你的最终结果,显然你必须改变的不仅仅是这些,但你说代码不完整。这是循环无法正常工作的问题。
关于javascript - 在循环递归期间,索引计数丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46191752/
我是一名优秀的程序员,十分优秀!