2014-10-10 1 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으로 숫자를 반환합니다 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

+1 훌륭한 아이디어이지만'undefined' 나'null' 값에는 사용할 수 없습니다. – Oriol

+0

@Oriol Thx, fixed. –

+0

멋지고 간결한 감사합니다! 'Date'는 * now *로 재설정되고 함수도 잘립니다. 'NaN'과'Infinity'는 모두'0'으로 리셋됩니다. 이는 둘 다'number' 타입이기 때문에 의미가 있습니다. – CoDEmanX

1

underscore.js 부분 인 OMIT를 찾고있을 수 있습니다. 여과

omit_.omit (목적, * 키) 객체의 복사본을 반환은 블랙리스트 키 (또는 키의 배열)을 생략합니다. 또는 생략 할 키를 나타내는 술어를 허용합니다.

_.omit ({이름 : 'moe', 나이 : 50, 사용자 ID : 'moe1'}, '사용자 ID'); => {name : 'moe', age : 50} _.omit ({이름 : 'moe', 나이 : 50, userid : 'moe1'}, 함수 (값, 키, 객체) {return _.isNumber (값);}); => {이름 : '모에', 사용자 ID : 'moe1'}

+1

이를 다른 문제를 해결하는 것 같습니다. –

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:{}} 
관련 문제