Javascript 在循环中递归期间,索引计数丢失
目标: 我正在使用AngularJS和Lodash开发一个应用程序。我需要一个执行以下转换的函数: 从 进入 现在,我正在使用递归函数遍历对象。目前,我的代码看起来是这样的(不完整):Javascript 在循环中递归期间,索引计数丢失,javascript,angularjs,recursion,lodash,Javascript,Angularjs,Recursion,Lodash,目标: 我正在使用AngularJS和Lodash开发一个应用程序。我需要一个执行以下转换的函数: 从 进入 现在,我正在使用递归函数遍历对象。目前,我的代码看起来是这样的(不完整): var obj={}, 钥匙、财产、价值; var recur=功能(mat){ 键=对象。键(mat); 对于(变量i=0;i
var obj={},
钥匙、财产、价值;
var recur=功能(mat){
键=对象。键(mat);
对于(变量i=0;i }这是因为键
在错误的范围内声明。它应该在重复
中声明。由于不是这样,当recur
递归时,键将被覆盖
这并不意味着i
不会增加,但这确实意味着循环会在意外的时候终止,因为键在递归时会发生变化
属性
和值
也应在重复
中声明;通常,在最内部的范围内声明变量。(temp
根本不需要声明,因为您从未使用过它。)
为了得到最终结果,显然您需要做的不仅仅是更改,但是您说代码不完整。这就是循环工作不正常的问题。这是因为键
在错误的范围内声明。它应该在重复
中声明。由于不是这样,当recur
递归时,键将被覆盖
这并不意味着i
不会增加,但这确实意味着循环会在意外的时候终止,因为键在递归时会发生变化
属性
和值
也应在重复
中声明;通常,在最内部的范围内声明变量。(temp
根本不需要声明,因为您从未使用过它。)
为了得到最终结果,显然您需要做的不仅仅是更改,但是您说代码不完整。这就是循环无法正常工作的问题。要转换有效对象,可以使用迭代和递归方法获取值及其路径
函数转换(对象){
功能iter(o,p){
Object.keys(o).forEach(函数(k){
var q=p.concat(k);
if(o[k]&&typeof o[k]=“object”){
iter(o[k],q);
返回;
}
对象[q.join('.')]=o[k];
});
}
Object.keys(对象).forEach(函数(k){
if(对象[k]&&typeof对象[k]='object'){
iter(对象[k],[k]);
删除对象[k];
}
});
}
var对象={a:0,b:{x:{y:1,z:2}},c:3};
转换(对象);
console.log(对象)代码>要转换有效对象,可以使用迭代和递归方法获取值及其路径
函数转换(对象){
功能iter(o,p){
Object.keys(o).forEach(函数(k){
var q=p.concat(k);
if(o[k]&&typeof o[k]=“object”){
iter(o[k],q);
返回;
}
对象[q.join('.')]=o[k];
});
}
Object.keys(对象).forEach(函数(k){
if(对象[k]&&typeof对象[k]='object'){
iter(对象[k],[k]);
删除对象[k];
}
});
}
var对象={a:0,b:{x:{y:1,z:2}},c:3};
转换(对象);
console.log(对象)代码>您可以按以下方式执行
让obj={
答:0,,
b:{x:{y:1,z:2},
c:3
}
让结果={};
功能记录(对象、父对象){
如果(对象类型=='object'){
for(出租对象中的属性){
rec(对象[属性],(父项=''?父项:父项+')+属性);
}
}
否则{
结果[父项]=obj;
}
}
rec(obj,”);
控制台日志(结果)代码>您可以按以下方式执行
让obj={
答:0,,
b:{x:{y:1,z:2},
c:3
}
让结果={};
功能记录(对象、父对象){
如果(对象类型=='object'){
for(出租对象中的属性){
rec(对象[属性],(父项=''?父项:父项+')+属性);
}
}
否则{
结果[父项]=obj;
}
}
rec(obj,”);
控制台日志(结果)代码>谢谢大家的帮助(尤其是@T.J.Crowder指出了我在scope上犯的错误)
我的完整代码(欢迎提出任何与良好/不良做法相关的建议):
var recur=函数(对象、对象、父对象){
var keys=Object.keys(mat);
对于(变量i=0;i{
a: 0,
b: {x: {y: 1, z: 2}},
c: 3
}
{
a: 0,
'b.x.y': 1,
'b.x.z': 2,
c: 3
}