Chcę utworzyć wielowymiarową tablicę tego z następującego kodu.

var i = 0;
$('.button_image').each(function () {
    buttons[i]['left'] = $(this).position().left;
    buttons[i]['top'] = $(this).position().top;
    i++;
});

Tablica powinna być taka

buttons[1]['left']=10;
button[1][top]=20;
buttons[2]['left']=40;
button[2][top]=50;

Ale daje następujący błąd na konsoli Firefoksa.

TypeError: buttons[i] is undefined
buttons[i]['left']=$(this).position().left;

Powiedz mi, co jest nie tak na moim kodzie. Z góry dziękuję.

Chcę ten format:

[rows] => Array ( 
        [0] => Array ( 
                 [column1] => hello 
                 [column2] => hola 
                 [column3] => bonjour )
        [1] => Array ( 
                 [column1] => goodbye 
                 [column2] => hasta luego 
                 [column3] => au revoir ) )
1
Krishna Karki 9 grudzień 2013, 15:55

4 odpowiedzi

Najlepsza odpowiedź

Javascript nie ma wielowymiarowych tablic, ma tylko miejsca macierzy lub obiektów obiektów itp.

Aby więc utworzyć tablicę wewnątrz innej tablicy, musisz zdefiniować element i samej tablicy początkowej jako głównej tablicy. Możesz to zrobić, po prostu dodając inicjalizację buttons[i] = []; w pętli each.

Jednak co naprawdę potrzebujesz, jest obiektem zamiast tablicy, , ponieważ macierze mogą mieć tylko indeksy numeryczne, takie jak buttons[0][2], a obiekty mogą mieć dowolne indeksy, takie jak buttons[0]['left'] lub Odpowiednikowa notacja buttons[0].left jak napisałeś w swoim pytaniu.

// this is making buttons[i] a new object:
buttons[i] = {};  // the preferred notation over "new Object();"

// now this works without problem:
buttons[i]['left'] = $(this).position().left;
buttons[i]['top']  = $(this).position().top;

// equivalent notation:
buttons[i].left = $(this).position().left;
3
Christoph 9 grudzień 2013, 12:12

Należy zainicjować obiekty przed użyciem drugiego wymiaru tablicy.

Oto przykład:

var myArr = new Array();
myArr[0] = new Array();
myArr[0][0] = 'Hello';
myArr[0][1] = 'World!';
alert(myArr[0][0] + ' ' + myArr[0][1]);
0
developer82 9 grudzień 2013, 11:59

Po prostu popchnij nowe obiekty do tablicy.

var buttons = [];
$('.button_image').each(function () {
  buttons.push({
    left: $(this).position().left,
    top: $(this).position().top
  });
});

Następnie możesz uzyskać dostęp do obiektów za pomocą indeksów: buttons[1].left na przykład.

0
Andy 9 grudzień 2013, 12:05

Możesz zrobić znacznie prostszy:

var buttons = $('.button_image').map(function () {
    return $(this).position();
}).get();

To powiedział: Oto jak naprawić kod:

var i = 0, buttons = []; // init "buttons" as an array
$('.button_image').each(function () {
    buttons[i] = {}; // init "buttons[i]" as an object
    buttons[i]['left'] = $(this).position().left;
    buttons[i]['top'] = $(this).position().top;
    i++;
});

Być może odgadłeś, że to nie jest wielowymiarowa tablica, wolałbym nazwać to "tablicą obiektów": [{ left: 10, top: 20 }, { left: 40, top: 50 }]. Nie widzę jednak połączenia między pierwszą częścią pytania a żądanym formatem.

0
leaf 9 grudzień 2013, 21:24