2016-03-07 86 views
3

我有一个数组的数组。我希望能够遍历每个数组,并为每个数组添加新键或更新现有值。如何循环使用jQuery的数组数组?

这里是我有什么

var values = []; 

    values['123'] = []; 
    values['456'] = []; 
    values['123']['x1'] = 'value 1'; 
    values['123']['x2'] = 'value 2'; 

我要遍历所有的值数组,并添加新键阵列的每个阵列。 (即values['123']values['456']

这里是我试过

$.each(values, function(index, value){ 

    value['x1'] = 'new value 1'; 
    value['x10'] = 'new value 10'; 
    value['x20'] = 'new value 20'; 
    console.log(value); 

}); 

控制台显示此错误

TypeError: value is undefined 

这里是一个fiddle

我怎样才能正确地将循环每个阵列项目并更新原始数组?

回答

1

其实对于你的情况,你需要使用Object,不Array

对于构建非数字指标,你应该使用{}

{} - 构建Object[] - 构建Array

jQuery.each()可用于遍历对象阵列

试试这个代码

$(function() { 
    $('#x').click(function(e) { 
     var values = {}; // here 

     values['123'] = {}; // here 
     values['456'] = {}; // here 
     values['123']['x1'] = 'value1'; 
     values['123']['x2'] = 'value2'; 


     $.each(values, function(index, value) { 

      value['x1'] = 'new value 1'; 
      value['x10'] = 'new value 10'; 
      value['x20'] = 'new value 20'; 
      console.log(value); 

     }); 
    }); 
}); 
+0

这工作!你能告诉我{}和[]有什么区别吗? –

+1

@MikeA在这里,**值**被初始化为一个对象(请参阅** {} **)而不是数组。 ** $。each()**函数在对象的情况下将** 123 **和** 456 **作为关键字,但是在数组的情况下它会将它们视为索引。这就是为什么我在下面的代码中添加了**值[index]!== undefined **条件。 –

+0

非常感谢您的帮助 –

0

发生这种情况,因为你的values阵列是越来越有指标123456初始化。因此,$.each()函数假定阵列长度为457,因此从元素索引0开始,但该索引处没有值。

为了克服这一点,你可以简单地做如下改变,它会与工作

$.each(values, function(index, value){ 
    if(values[index] !== undefined) { 
     value['x1'] = 'new value 1'; 
     value['x10'] = 'new value 10'; 
     value['x20'] = 'new value 20'; 

     //Update the new values in the values object. 
     values[index] = value; 
     console.log(value); 
    } 
}); 
+0

删除了错误,但值现在是空的,它不应该。 –

+0

检查我更新的答案。 **值**对象之前没有更新最新值。它现在应该按需要工作。 –

+0

根据你的问题,既然你问了如何循环一个数组数组,这应该是答案。由于这里,我没有对你的数组结构做任何改变。当前接受的答案通过简单地将主数组更改为对象来改变底层结构。 –