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

问题描述 投票:2回答:3

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

如果没有,有没有比递归迭代所有属性,检查类型,必要时删除重置更聪明的解决方案?

javascript object truncate
3个回答
7
投票

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

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

这也将把数字返回为0,把布尔函数返回为false,把日期返回为now,把regexps返回为空(但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
投票

你可能在寻找OMIT,即是OMIT的一部分 underscore.js.

omit_.省略(object, *keys) 返回一个对象的副本,过滤后省略黑名单中的键(或键数组)。也可以接受一个表示要省略哪些键的谓词。

_.省略({name: 'moe', age: 50, userid: 'moe1'}, 'userid'); => {name: 'moe', age: 50}。 _.省略({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object) { return _.isNumber(value); }); => {name: 'moe', userid: 'moe1'}。


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:{}}
© www.soinside.com 2019 - 2024. All rights reserved.