Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在循环中递归期间,索引计数丢失_Javascript_Angularjs_Recursion_Lodash - Fatal编程技术网

Javascript 在循环中递归期间,索引计数丢失

Javascript 在循环中递归期间,索引计数丢失,javascript,angularjs,recursion,lodash,Javascript,Angularjs,Recursion,Lodash,目标: 我正在使用AngularJS和Lodash开发一个应用程序。我需要一个执行以下转换的函数: 从 进入 现在,我正在使用递归函数遍历对象。目前,我的代码看起来是这样的(不完整): var obj={}, 钥匙、财产、价值; var recur=功能(mat){ 键=对象。键(mat); 对于(变量i=0;i

目标:

我正在使用AngularJS和Lodash开发一个应用程序。我需要一个执行以下转换的函数:

进入

现在,我正在使用递归函数遍历对象。目前,我的代码看起来是这样的(不完整):

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
}