5

Im creating an invoice for books, and aim to submit it via ajax. Im trying to json encode the array of books in the invoice, however I keep getting a blank value

 //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));
Outputs: [[]]

alert(order_items.toString());
Outputs: blank

console.log(order_items);
Output:

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]

My array is being created, but somehow I cant seem to json encode it? Am I doing something wrong?

3 Answers 3

4

Array and Object are different beasts. Your bookdata is not an array, but an object, thus, you should create it with

var bookdata = {};

Sign up to request clarification or add additional context in comments.

4 Comments

And, for readability, assign with bookdata.isbn = ... instead of square brackets and strings (it is the same, by definition, in ES5 spec).
See also @Jack's answer below, you could bind creation of empty {} with filling it as shown there (I would probably do it, too, as a second step; I fixed the immediate bug).
Thanks for explaining it, I assumed bookdata was also an array because the console.log output said 'array'
@pinkpixycoder Yes, it was an array, you created it as such: []. The variable will hold what you put to it, empty array [], empty object {} or whatever else.
3

Arrays are serialized differently with JSON.stringify() as opposed to regular objects (only properties of UInt32 are serialized). Since you're only adding textual properties to the bookdata, you should use anonymous objects like this:

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

Comments

0

you may try

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));

your only mistake was a try to create associative arrays instead of using objects, that can do it

2 Comments

just tell why are you downvoting
Your code works perfectly! Thanks! Im assuming your post was downvoted simply because I asked 'what i was doing wrong', not for the code itself :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.