2011-08-12 105 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

或相當'一個具有AA價值和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:就是這樣。只需將對象推送到您的陣列。否則你會失去它們。 – 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

我認爲真正的最佳解決方案取決於我是否會通過其名稱屬性更多地訪問特定的test.member,或通過字符串打印它。我認爲通過名稱(members-is-an-array)訪問將需要MAX循環來找到我的值,而通過創建臨時數組來創建臨時數組需要總是N循環。陣列的想法肯定似乎更有效率! – mpw

相關問題