代码之家  ›  专栏  ›  技术社区  ›  AdRock

javascript将所有嵌套对象属性设置为空

  •  1
  • AdRock  · 技术社区  · 6 年前

    如何循环遍历每个嵌套的对象属性,并将它们全部设置为空?我只需要去两个层次,所以任何 prop 对象的也需要为空。

    var objs = {
        a: {
            prop1: {id: null, ctx: CanvasRenderingContext2D},
            prop2: true,
            prop3: null,
            prop4: null,
            prop5: true,
            prop6: null,
            prop7: null,
            prop8: true,
            prop9: null,
            prop10: null,
            prop11: true,
        },
        b: {
            prop1: {id: null, ctx: CanvasRenderingContext2D},
            prop2: true,
            prop3: null,
            prop4: null,
            prop5: true,
            prop6: null,
            prop7: null,
            prop8: true,
        },
        c: {
            prop1: {id: null, ctx: CanvasRenderingContext2D},
            prop2: true,
            prop3: null,
            prop4: null,
            prop5: true,
        }
    }
    

    我试过了,但它会进入 prop1 我不想看到的东西。

    function nullify  (obj) { 
        for(key in obj) { 
            if (typeof obj[key] == "object") {
              obj[key] = nullify(obj[key]);
            }
            else if(obj[key] != null) {
                obj[key] = null;
            }
       }
       return obj;
    }
    
    nullify  (objs)
    

    我也试过这个,但这是通过外键的每个字母,而不是内部属性

    for (obj in objs) {
        if (objs.hasOwnProperty(obj)) {
            for (key in obj) {
                if (obj.hasOwnProperty(key)) {
                    obj[key] = null;
                }
            }
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Mark    6 年前

    因为您只需要执行两个级别,所以可以循环子对象的键:

    var objs = {a: {prop1: {id: null, ctx: `CanvasRenderingContext2D`},prop2: true,prop3: null,prop4: null,prop5: true,prop6: null,prop7: null,prop8: true,prop9: null,prop10: null,prop11: true,},b: {prop1: {id: null, ctx: `CanvasRenderingContext2D`},prop2: true,prop3: null,prop4: null,prop5: true,prop6: null,prop7: null,prop8: true,},c: {prop1: {id: null, ctx: `CanvasRenderingContext2D`},prop2: true,prop3: null,prop4: null,prop5: true,}}
    
    Object.values(objs).forEach(val => {
      for (key in val) val[key] = null
    })
    console.log(objs)
        2
  •  0
  •   dipea    6 年前

    这能起作用吗?

    function nullify(obj, depth) {
        depth = depth || 0;
        if (depth > 1) return obj;
        for(key in obj) {
            if (typeof obj[key] == "object") {
              obj[key] = nullify(obj[key], depth + 1);
            }
            else if(obj[key] != null) {
                obj[key] = null;
            }
       }
       return obj;
    }
    

    编辑:

    不用传入 depth 论点: nullify(objs)