2011-06-27 15 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