2014-10-10 1183 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:{}}