【问题标题】:Return all properties in JS object to "empty" state将 JS 对象中的所有属性返回到“空”状态
【发布时间】:2014-10-10 17:59:59
【问题描述】:

我想知道在任何像 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


    【解决方案1】:

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

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

    这还将返回数字为 0,布尔值返回 false,日期为现在,正则表达式为空(但 NaN 仍为 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 好主意,但不适用于 undefinednull 值。
    • 简洁明了,谢谢! Dates 被重置为 now,函数也被截断。 NaNInfinity 被重置为 0,这是有道理的,因为两者都是 number 类型。
    • 是的,由于某种原因,正则表达式被重置为/(?:)/
    • // 不能用于创建空的正则表达式,因为它显然用于单行 cmets。 /()/ 可以使用,但() 创建一个捕获组。因此,使用了/(?:)/?: 表示非捕获组)。
    • 您的变体 2 不起作用,没有变量 val 并且即使在我添加 var val = obj[k]; 之后它似乎也不会递归到对象中
    【解决方案2】:

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

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

    _.omit({name: 'moe', age: 50, userid: 'moe1'}, 'userid'); => {名称:“萌”,年龄:50} _.omit({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object) { return _.isNumber(value); }); => {name: 'moe', userid: 'moe1'}

    【讨论】:

    • 这似乎解决了另一个问题。
    【解决方案3】:
    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:{}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      相关资源
      最近更新 更多