Javascript 循环通过对象数组和对象数组等

Javascript 循环通过对象数组和对象数组等,javascript,arrays,Javascript,Arrays,我有一个通用函数,我想用任何对象结构调用它。有些对象具有对象数组,而这些对象数组又具有对象数组等 我让它工作的唯一方法就是这样,这似乎不是最聪明的方法,因为我一直在增加函数的深度 有更好的办法吗?我尝试了在堆栈上找到的一个递归函数,但无法使其工作 //在一级查找所有内容 for(textfield中的var属性){ //有场地吗? if(textfield.hasOwnProperty(property)){ //一级是物体吗 if(文本字段的类型[属性]=“对象”){ //在第二级寻找每一件事

我有一个通用函数,我想用任何对象结构调用它。有些对象具有对象数组,而这些对象数组又具有对象数组等

我让它工作的唯一方法就是这样,这似乎不是最聪明的方法,因为我一直在增加函数的深度

有更好的办法吗?我尝试了在堆栈上找到的一个递归函数,但无法使其工作

//在一级查找所有内容
for(textfield中的var属性){
//有场地吗?
if(textfield.hasOwnProperty(property)){
//一级是物体吗
if(文本字段的类型[属性]=“对象”){
//在第二级寻找每一件事
for(文本字段[属性]中的var子属性){
//有场地吗?
if(textfield[property].hasOwnProperty(subperty)){
//第二层是物体吗
if(文本字段[属性][子属性]=“对象”的类型){
//在第三级寻找每一件事
for(textfield[property][subperty]中的var subSubProperty){
//有场地吗?
if(textfield[property][subProperty].hasOwnProperty(subSubProperty)){
//第三层是物体吗
if(文本字段的类型[属性][子属性][子属性]=“对象”){
//在第四级寻找每一件事
for(文本字段[property][subProperty][subSubProperty]中的var subSubSubProperty){
//翻译第四级的所有内容
console.log(“第四级”)
log(“循环:“+textfield[property][subperty][subSubProperty][subSubSubProperty]);
log(“类型:“+typeof textfield[property][subProperty][subSubSubProperty][subSubSubProperty]);
textfield[property][subperty][subSubProperty][subSubSubProperty]=replaceFields(textfield[property][subperty][subSubProperty][subSubSubProperty]);
}
}否则{
//翻译第三级的所有内容
console.log(“第三级”)
log(“循环:“+textfield[property][subperty][subSubProperty]);
log(“TYPE:+typeof textfield[property][subperty][subSubProperty]);
textfield[property][subperty][subSubProperty]=replaceFields(textfield[property][subperty][subsubsubproperty]);
}
}
}
}否则{
//在第二级翻译所有内容
console.log(“第二级”)
log(“循环:“+textfield[property][subperty]);
log(“TYPE:+typeof textfield[property][subperty]);
textfield[property][subperty]=replaceFields(textfield[property][subperty]);
}
}
}
}否则{
//在一级翻译所有内容
console.log(“第1级”)
log(“循环:“+textfield[property]);
log(“TYPE:+typeof textfield[property]);
textfield[property]=replaceFields(textfield[property]);
}
}
}
多亏了金维珠下面的回答,这是最终版本,它工作得非常完美

function translateAll(textfield) {
    for (var property in textfield) {
        if (!textfield.hasOwnProperty(property)) {
            return false;
        } else if (typeof textfield[property] !== "object") {
            textfield[property] = replaceFields(textfield[property]);
        } else {
            translateAll(textfield[property]);
        }
    }
}

我不确定您想对对象或数组值做什么,但我希望这会对您有所帮助。对于对象或数组,以下函数打印值并递归调用自身:

const getValues=(值,路径=“”)=>{
如果(值的类型===‘对象’
&&值!==null
&&value.length==未定义
&&对象。键(值)。长度>0){
//它是一个对象(不是null、数组或日期实例)
Object.keys(value).forEach((prop)=>{
const_path=path.length?`${path}.${prop}`:prop;
获取值(值[prop],_路径);
});
}else if(typeof value==='object'
&&值!==null
&&值(长度>0){
//它是一个数组
value.forEach((项目,idx)=>{
const_path=path.length?`${path}[${idx}]`:idx;
获取值(项,路径);
});
}否则{
log(`${path}=${JSON.stringify(value)}`);
}
};
例如:

const obj={
答:1,,
b:{a:1,b:2},
c:[
{a:1,b:2},
{a:1,b:2},
],
d:{},
e:[],
f:新日期(),
g:空,
h:未定义,
};
获取值(obj,'obj');
将输出:

obj.a = 1
obj.b.a = 1
obj.b.b = 2
obj.c[0].a = 1
obj.c[0].b = 2
obj.c[1].a = 1
obj.c[1].b = 2
obj.d = {}
obj.e = []
obj.f = "2020-07-14T06:02:12.037Z"
obj.g = null
obj.h = undefined

我不确定你的意思和我所理解的是一样的

let index = 0;
function fn(textfield) {
    index++;
    for (var property in textfield) {
        if (!textfield.hasOwnProperty(property)) {
            return false;
        } else if (typeof textfield[property] !== "object") {
            console.log("-----------------------LEVEL " + index);
            console.log("LOOP: " + textfield[property]);
            console.log("TYPE: " + typeof textfield[property]);
            // textfield[property] = replaceFields(textfield[property]);
        } else {
            fn(textfield[property]);
        }
    }
}
const obj = {a:{ b: { c: { d:1} } }};
fn(obj);

请给出一个对象示例,并向我们展示您尝试过的递归函数,这样我们就可以修复它,理想情况下是这样。您能否提供一个对象数组的示例?递归是更好的方法。这可能会有帮助:你的对象是否不包含自己的属性?你们是对的,让我找一个合适的例子,你们的索引使这个更容易理解和调试-我将尝试一下!简单而优雅-查看我的原始帖子,在那里我把你的想法测试后的最终结果放在那里!!