2016-03-07 3 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

Как я могу correcly петлю на каждом массиве и обновить исходный массив?

ответ

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 ** как ключи в случае объекта, однако в случае массива он обрабатывает их как индексы. Вот почему я добавил значение ** values ​​[index]! == undefined ** в моем коде ниже. –

+0

Большое спасибо за вашу помощь –

0

Это происходит потому, что ваш values массив становится инициализируется с индексами 123 и 456. Таким образом, функция $.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

Проверьте обновленный ответ. Объект ** values ​​** ранее не обновлялся с последними значениями. Он должен работать по мере необходимости. –

+0

В соответствии с вашим вопросом, так как вы спросили, как закодировать массив массивов, это должен быть ответ. Поскольку здесь я не вносил никаких изменений в структуру массива. Текущий принятый ответ вносит изменения в базовую структуру, просто меняя основной массив на объект. –