将JS对象中的所有属性返回到"空"状态

CoD*_*anX 2 javascript truncate object clear

我想知道在jQuery这样的任何框架中是否有一个实用函数来截断一个JS对象(有多个可能的结果,不确定什么是最有用的):

{ // original object
    foo: "bar",
    arr: [1, 2, 3],
    sub: {a: 4, b: 5, subsub: {c: 6}} }

{ // truncated, variant 1
    foo: "",
    arr: [],
    sub: {} }

{ // truncated, variant 2
    foo: "",
    arr: [],
    sub: {subsub: {}} }

{ // truncated, variant 3
    foo: "",
    arr: [],
    sub: {a: 0, b: 0, subsub: {c: 0}} }
Run Code Online (Sandbox Code Playgroud)

如果不是,是否有一个比递归迭代所有属性更聪明的解决方案,检查类型并在必要时删除/重置?

小智 7

调用每个属性的构造函数以创建相同类型的空对象.

for (var k in obj) {
    obj[k] = obj[k] && obj[k].constructor();
}
Run Code Online (Sandbox Code Playgroud)

这也将数字返回0,布尔值为false,日期为现在,正则表达式为空(但NaNs仍为NaN).

要以递归方式执行此操作,保留对象值属性,但也将它们清空(变体3):

function truncate(obj) {
    for (var k in obj) {
        var ctor = obj[k] && obj[k].constructor;
        if      (ctor === Object) truncate(obj[k]);
        else if (ctor)            obj[k] = ctor();
    }
}
Run Code Online (Sandbox Code Playgroud)

要消除数字(变体2),请添加一个检查:

function truncate(obj) {
    for (var k in obj) {
        var ctor = obj[k] && obj[k].constructor;
        if      (ctor === Object) truncate(obj[k]);
        else if (ctor === Number) delete obj[k];
        else if (ctor)            obj[k] = ctor();
    }
}
Run Code Online (Sandbox Code Playgroud)