2011-06-27 18 views
1

我正在努力解決特定的Javascript問題,我希望有人能夠提供幫助。Javascript列表中的數組串聯

我有名稱和值對的列表,如:

蘋果50
香蕉60
葡萄70
蘋果40
橙30

我想創建一個Javascript對象超出以下數值:

var myObj = {}; 

,然後在列表中的所有項目:

myObj[name] = value; 

,但你可以看到一些名字在列表中不止一次(例如蘋果),所以在這種情況下,我想通過將對象中的值轉換爲數組並將新值添加到數組中,將其添加到對象的同一個屬性中。

所以MyObj中會包含:

蘋果= [50,40]
香蕉= 60
葡萄= 70
橙色= 30

誰能幫助?

感謝,

AJ

+1

爲什麼不把所有的值作爲數組,然後將新的值推送給它,如果對象以該名稱存在? – Shef

回答

2

像這樣:

var obj = { }; 
for (var i = 0; i < keys.length; i++) { 
    var k = keys[i]; 

    if (k in obj) { 
     if (obj[k] instanceof Array) { 
      obj[k].push(values[i]); 
     else 
      obj[k] = [ obj[k], values[i] ]; 
    } else 
     obj[k] = values[i]; 
} 

如果某些值已經陣列,它們將被夷爲平地,沒有嵌套。

+0

它可能重複兩次,三次,誰知道還有多少次。這會在數組內部產生一個數組,在另一個數組內,等等。 – Shef

+0

@Shef:你是對的;固定。謝謝 – SLaks

+0

謝謝,這很好,我選擇這個答案,因爲它對我來說更容易理解。 –

2

我的方式。

var MyObj = function(){}; 
MyObj.prototype.addItem = function(key, val){ 
    var typ = typeof this[key]; 
    switch (typ){ 
     case 'undefined': 
      this[key] = val; 
      break; 
     case 'object': 
      this[key].push(val); 
      break; 
     default: 
      this[key] = [this[key], val]; 
      break; 
    } 
} 

var myObj = new MyObj; 

myObj.addItem('Apple', 50); 
myObj.addItem('Apple', 70); 

console.log(myObj); 
+0

'typeof [] ===「object」' – SLaks

+2

這不起作用; 'typeof'不會返回'Array' – SLaks

+0

對不起,謝謝! – senta