2011-08-12 5 views
4

가끔씩 (값을 변경하기 위해 어떨까요?) 때때로 액세스 할 수있는 객체 배열을 가지고 있다고합시다. 여기JS : 객체 배열에 join() -

var test = { members : [] }; 
test.addMember = function(name, value) { 
    this.members[name] = { name : name, value : value }; 
    this.members[name].toString = function() { 
     return this.name + " has a " + this.value; }; 
}; 
test.toString = function() { 
    return this.members.join(" and "); 
}; 
test.addMember("a", "a value"); 
test.addMember("b", "b value"); 
alert(test); 

내 목표는 test.toString() 반환을하는 것입니다 :

a has a value and b has b value 

또는 무엇을 가지고 - 당신은. MDN을 읽었을 때 JavaScript 1.8.5 (또는 일부 하위 버전)에 toString()을 호출하는 join()이있는 것으로 보입니다. 내가 붙어 있니?

감사합니다.

편집 : 수정 및 삭제 기능이 포함 된 나의 최종 디자인은 다음과 같습니다 (궁금한 점이있는 경우를 대비하여)!

var test = { 
    members : [], 
    modifyMember : function(name, value) { 
     var index = this.members.indexOf(this.members[name]); 
     if(index < 0) { 
      return; 
     } 
     this.members[index].value = this.members[name].value = value; 
    }, 
    addMember : function(name, value) { 
     if(this.members[name]) { 
      this.modifyMember(name, value); 
      return; 
     } 
     this.members[name] = { 
      name : name, 
      value : value, 
      toString : function() { 
       return this.name + " has " + this.value; 
      }, 
     }; 
     this.members.push(this.members[name]); 
    }, 
    removeMember : function(name) { 
     if(!this.members[name]) return; 
     this.members.splice(this.members.indexOf(this.members[name]), 1); 
     delete this.members[name]; 
    }, 
    toString : function() { 
     return this.members.join(" AND "); 
    } 
}; 
+0

또는 오히려이의'금주 모임을 가지고 값과 b는 ab 값을 가짐'? – naveen

+0

음 ... 그렇습니다. 그것이 바로 제가 의미했던 것입니다. – mpw

+0

나는 stewe의 대답과 gilly3의 대답을 좋아한다. Stewe는 좀 더 처리가 필요하고, gilly3은 메모리 사용량이 조금 더 많습니다. 나는 gilly3을 사용하기로 결정했지만, 빠른 답변을 주신 모든 분들께 감사 드리고 싶습니다. 내 첫 번째 질문을 stackoverflow에 게시 된 주셔서 고마워 다시 나를 다시 것입니다! 건배! – mpw

답변

0

이미 속성을 사용하여 배열을 확장하고 있습니다. 이제 배열을 채우는 것을 잊지 마십시오. Array.push() 사용

test.addMember = function(name, value) { 
    this.members[name] = { name : name, value : value }; 
    this.members.push(this.members[name]); 
    ... 
}; 
+0

+1 @ mpw : thats it. 그냥 배열에 개체를 밀어. 그렇지 않으면 잃을 것입니다. – naveen

+0

expando를 모두 추가하는 것을 피해야합니다. 더 좋은 해결책은 객체를 직접 추가하고 다른 방식으로 중복을 다루는 것입니다. – gf3

+0

키 값을 추가하면 (물론) 키 액세스가 허용되지만 join()은 중단됩니다. 객체를 배열에 푸시하면 키를 통해 액세스 할 수 없지만 (가짜 메소드를 만들 수는 있지만) 조인 할 수 있습니다. 두 가지를 모두하는 것은 반복을 피하는 것 같습니다. 나는 피하는 것을 선호합니다. – mpw

0

한 가지 방법은 다음과 같습니다 (회원 객체이다)

var test = { members : {} }; 
test.addMember = function(name, value) { 
    this.members[name] = { name : name, value : value }; 
    this.members[name].toString = function() { 
     return this.name + " has a " + this.value; }; 
}; 
test.toString = function() { 
    var arr=[]; 
    for(var i in this.members) { 
     if (this.members.hasOwnProperty(i)){ 
      arr.push(this.members[i].toString()); 
     } 
    } 
    return arr.join(" and "); 
}; 
test.addMember("a", "a value"); 
test.addMember("b", "b value"); 
alert(test.toString()); 

그리고 다른 방법 (회원 배열입니다) :

var test = { members : [] }; 
test.addMember = function(name, value) { 
    var arr= { name : name, value : value }; 
    arr.toString = function() { 
     return this.name + " has a " + this.value; 
    }; 
    this.members.push(arr); 
}; 
test.toString = function() { 
    return this.members.join(" and "); 
}; 
test.addMember("a", "a value"); 
test.addMember("b", "b value"); 
alert(test.toString()); 
+0

실제 최상의 솔루션은 name 속성을 통해 특정 test.member에 액세스하는 것이 더 많은지 아니면 문자열을 통해 인쇄하는지에 따라 달라집니다. 임시 어레이를 생성하여 toString-ing이 항상 N 개의 루프를 요구하는 반면 name (members-is-an-array)을 통한 액세스는 MAX 값이 N 개의 루프를 필요로합니다. 배열 아이디어가 확실히 더 효율적으로 보인다! – mpw

관련 문제