Dlaczego muszę zrobić dwa razy JSON.parse, żeby znowu dostać obiekt po uprzednim JSON.stringify?

0
$("#invoice_list").dragtable({
	dataHeader: "data-name",
	retriveOrder: function () {
		console.log(JSON.parse(JSON.parse(localStorage.getItem('tableorder')))); // typeof === "string"
		console.log(JSON.parse(localStorage.getItem('tableorder')));  typeof === "object"
		return JSON.parse(JSON.parse(localStorage.getItem('tableorder')));
	},
	stop: function () {
		var order = $(this).dragtable('order');
		console.log(order); // typeof order === "object" zwykły array
		localStorage.setItem('tableorder', JSON.stringify(order));
		ColumnManager.sortColumns(order);
	}
});

Z pozoru zwykły od taki sobie kod w js, a jednak nie.. W momencie wykonania localStorage.setItem('tableorder', JSON.stringify(order)); do localStorage trafia taki string:

"[\"invoice_id\", \"buyer\", \"iv_type\", \"sell_date\", \"bill_date\", \"due_date\", \"invoice_amount_net\", \"vat_value\", \"invnumber\", \"invoice_amount_gross\", \"payment_left\", \"payment_sum\", \"last_payment_date\", \"user\", \"department_name\", \"drs\", \"rate\", \"commission_percent\", \"is_address_tracking\", \"is_offer_exclusive\", \"is_krd\", \"dc_stage\", \"comment\", \"\"]"

Jeżeli chce znowu dostac tablicę swoich kolumn to musze zrobić dwa razy JSON.parse.

What the javascript?

0

Chyba odwrotnie napisałeś swoje komentarze typeof ;)

W każdym razie - jesteś pewien, że:
a) nie masz jakiegoś wrappera/polyfilla na localStorage?
b) nie nadpisujesz tej wartości w innym miejscu w kodzie?

Wklejając to, co pokazujesz bezpośrednio w konsolę JS wszystko jest w porządku, więc problem leży gdzieś poza tym kodem.

0

Okej, więc tak wygląda test:

var order = $(this).dragtable('order');
console.log(order);
console.log(Array.isArray(order));

console.log(JSON.stringify(order));
localStorage.setItem('tableorder', JSON.stringify(order));

var foo = JSON.parse(localStorage.getItem('tableorder'));
console.log(foo);
console.log(Array.isArray(foo));

var bar = JSON.parse(foo);
console.log(bar);
console.log(Array.isArray(bar));
["invnumber", "buyer", "iv_type", "sell_date", "bill_date", "invoice_id", "due_date", ..... ] -  order - chrome dev tools wskazuje, że to obiekt, mogę sobie go "zobaczyc"
true - Array.isArray(order)

"[\"invnumber\", \"buyer\", \"iv_type\", \"sell_date\", \"bill_date\", \"invoice_id\", .... ] - JSON.stringify(order)

["invnumber", "buyer", "iv_type", "sell_date", "bill_date", "invoice_id", ... ] - JSON.parse(localStorage.getItem('tableorder'));
false - Array.isArray(foo)

["invnumber", "buyer", "iv_type", "sell_date", "bill_date", "invoice_id", ... ] - JSON.parse(foo) - chrome dev tools wskazuje, że to obiekt, mogę sobie go "zobaczyc"
true - Array.isArray(bar)

Wiem, że jest OK dlatego tym bardziej mam WTF.

2

Jak nic musisz mieć albo zmodyfikowany localStorage, ew. zmodyfikowany Array, albo coś w tym rodzaju. Wbij sobie o tak:

order = ["invnumber", "buyer", "iv_type", "sell_date", "bill_date", "invoice_id", "due_date"]

i przeprowadź testy, u mnie:

http://i.imgur.com/T3DYf3G.png

Być może zmodyfikowany/wadliwy Array jest dostarczany przez dragtable, spróbuj jeszcze zrobić order = Array.from(order) zaraz po pobraniu.

0

@dzek69 wkur... się i zacząłem wywalać assety po kolei. Oto winowajca.. http://prototypejs.org/assets/2009/8/31/prototype.js

0

Prototype, jak sama nazwa wskazuje - wpina się w oryginalne obiekty i je modyfikuje ;) Czyli miałem rację. Pacnij tam przy którymś poście fajkę, żeby odhaczyć temat jako rozwiązany ;) @Desu

1 użytkowników online, w tym zalogowanych: 0, gości: 1