2013-07-10 3 views
5

Im, создающий счет-фактуру для книг и нацеленный на отправку через ajax. Im пытается JSON кодирования массива книг в счете, однако я получаю пустое значениеСтриптизируйте многомерный массив с помощью javascript

//create item list 
    var order_items = []; 
    $('#mi_books tbody tr.userbooks').each(function(index) 
    { 
     var bookisbn = $(this).find('td .mi_isbn').text(); 

     var bookdata = []; 
     bookdata['isbn'] = bookisbn; 
     bookdata['title'] = $(this).find('.mi_title').text(); 
     bookdata['qty'] = $(this).find('.mi_qty').text(); 
     bookdata['price'] = $(this).find('.mi_price').text(); 

     order_items.push(bookdata); 

    }); 
    alert(JSON.stringify(order_items)); 
    alert(order_items.toString()); 
    console.log(order_items); 

alert(JSON.stringify(order_items));
Выходы: [[]]

alert(order_items.toString());
Выходы: blank

console.log(order_items);
Выход:

Array[1] 
0: Array[0] 
isbn: "9781401216672" 
length: 0 
price: "1007" 
qty: "1" 
title: "Batman: The Killing Joke" 
__proto__: Array[0] 
length: 1 
__proto__: Array[0] 

Мой массив создается, но почему-то я не могу его кодировать json? Я делаю что-то неправильно?

ответ

0

вы можете попробовать

var order_items = {}; 
$('#mi_books tbody tr.userbooks').each(function(index) 
{ 
    var bookisbn = $(this).find('td .mi_isbn').text(); 

    var bookdata = { 
     'isbn': bookisbn, 
     'title': $(this).find('.mi_title').text(), 
     'qty': $(this).find('.mi_qty').text(), 
     'price': $(this).find('.mi_price').text() 
    }; 
    order_items[index] = bookdata; 
}); 
alert(JSON.stringify(order_items)); 

ваша единственная ошибка была попытка создания ассоциативных массивов вместо использования объекты, которые могут это сделать

+0

просто скажите, почему вы делаете downvoting – vladkras

+0

Ваш код работает отлично! Благодаря! Я предполагаю, что ваше сообщение было опущено просто потому, что я спросил «что я делаю неправильно», а не для самого кода :) – pinkpixycoder

+0

ok, я отредактирую для всех – vladkras

4

Array и Object - разные звери. Ваш bookdata не является массивом, а объект, таким образом, вы должны создать его с

var bookdata = {};

+0

И для удобства чтения присвойте 'bookdata.isbn = ...' вместо квадратных скобок и строк (это то же самое, по определению, в спецификации ES5). –

+0

См. Также ответ @ Jack ниже, вы можете связать создание пустого '{}' с заполнением его, как показано на нем (я, вероятно, сделаю это тоже как второй шаг, я исправил ошибку). –

+0

Спасибо за объяснение, я предположил, что bookdata также был массивом, потому что вывод console.log сказал 'array' – pinkpixycoder

3

Массивы упорядочиваются по-разному с JSON.stringify() в отличие от обычных объектов (только свойства UInt32 упорядочиваются). Так как вы добавляете только текстовые свойства в bookdata, вы должны использовать анонимные объекты, как это:

var bookdata = { 
    isbn: bookisbn, 
    title: $(this).find('.mi_title').text(), 
    qty: $(this).find('.mi_qty').text(), 
    price: $(this).find('.mi_price').text() 
}; 
+0

Спасибо! В этом есть смысл. Я применил его к моему коду сейчас – pinkpixycoder

Смежные вопросы