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

时间:2014-10-10 17:59:59

标签: javascript object clear truncate

我想知道在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}} }

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

3 个答案:

答案 0 :(得分:7)

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

for (var k in obj) {
    obj[k] = obj[k] && obj[k].constructor();
}

这也会将数字返回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();
    }
}

要消除数字(变体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();
    }
}

答案 1 :(得分:1)

您可能正在寻找OMIT,underscore.js的一部分。

  

omit_.omit(object,* keys)返回对象的副本,过滤到   省略列入黑名单的键(或键组)。或者接受a   谓词指示要省略哪些键。

     

_。省略({姓名:' moe',年龄:50,用户ID:' moe1'},' userid');   => {name:' moe',年龄:50}   _.omit({name:' moe',age:50,userid:' moe1'},function(value,key,object){return _.isNumber(value);} );   => {name:' moe',userid:' moe1'}

答案 2 :(得分:1)

Object.prototype.clear=function(){
    for (prop in this){
        if (typeof this[prop]==='string') this[prop]='';
        else if (this[prop] instanceof Array) this[prop]=[];
        else{
            this[prop]={}//variant 1
        }
    }
    return this;
}

var obj={
    foo:"bar", 
    arr:[1,2,3],
    sub:{b:4,c:5,subsub:{e:6}}
}

obj.clear()//returns {foo:"",arr:[],sub:{}}