2014-10-10 1175 views
2

我不知道是否有像jQuery这样的截断JS对象的任何框架中有效用函数(有多个可能的结果,不确定什么是最有用的):将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}} } 

如果没有,有没有一种解决方案更聪明,而不是递归遍历所有属性中,选择类型和删除/重置,如果有必要吗?

回答

7

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

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

这也将返回数字0,布尔假,日期到现在,和正则表达式为空(但保留的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

+1好主意,但不会用'undefined'和'null'值。 – Oriol 2014-10-10 18:11:24

+0

@Oriol Thx,固定。 – 2014-10-10 18:13:43

+0

不错,简洁,谢谢! '日期'重置为*现在*,函数也被截断。 'NaN'和'Inf​​inity'被重置为'0',这是合理的,因为它们都是'number'类型。 – CoDEmanX 2014-10-10 18:32:19

1

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

omit_.omit(对象,*键)返回对象的副本,过滤以 省略黑名单密钥(或多个密钥的阵列)。或者接受指示要省略哪些键的谓词 。 ({name:'moe',年龄:50,userid:'moe1'},'userid'); => {name:'moe',age:50} _.omit({name:'moe',age:50,userid:'moe1'},function(value,key,object){return _.isNumber (value);}); => {名称: 'MOE',用户ID: 'moe1'}

+1

这似乎正在解决一个不同的问题。 – 2014-10-10 18:15:23

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:{}}