2011-08-12 10 views
4

)私はハッシュとして時々(値を変更するために)、時には印刷することができるオブジェクトの配列を持っていると言います。JS:オブジェクトの配列を結合する(

a has a value and b has b value 

または何-持っている - あなた:ここ

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()の戻りを持つことです。私は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

か、むしろ 'aはAAを持っています値はbであり、値はbである。 – 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にアクセスするか、文字列を使って印刷するかによって異なります。名前を使ったアクセス(members-is-an-array)では、値を見つけるためにMAXのN個のループが必要ですが、一時的な配列を作成することによってtoString-ingには常にN個のループが必要です。配列の考え方はより効率的に見えます! – mpw

関連する問題