2013-05-09 16 views
16

Kiedy sznurowanie obiektu przy użyciu JSON.stringify (lub czegoś podobnego) jest sposobem na ograniczenie głębokości strufikacji, tj. Przejdź tylko do poziomów obiektów w drzewie obiektów i zignoruj ​​wszystko, co nadejdzie później (lub lepiej : umieścić tam symbole zastępcze, wskazując, że coś zostało pominięte)?Limit głębokości strufikacji JSON

Wiem, że JSON.stringify przyjmuje funkcję zastępującą w postaci function (key, value), ale nie znalazłem sposobu, aby uzyskać głębokość oryginalnego obiektu bieżącej pary klucz-wartość przekazana do funkcji zastępczej.

Czy jest jakiś sposób, aby to zrobić z domyślną implementacją JSON.stringify? Czy może osiągnąłem punkt, w którym powinienem sam wdrożyć szykowanie? Czy istnieje inna biblioteka ciągów, którą możesz polecić, która ma tę opcję?

+1

Wygląda na to, że ta zaakceptowana odpowiedź może być pomocna: http://stackoverflow.com/questions/13861254/json-stringify-deep-objects – Strille

+0

@Strille Hm, zawiera implementację, która robi to, co chcę. Rozumiem, co oznacza, że ​​nie jest to możliwe z domyślną implementacją? Wolę używać domyślnej implementacji, ponieważ zakładam, że jest szybsza, ponieważ jest implementowana natywnie. Ale dzięki za wskazówkę! –

+0

Nie, jestem pewien, że domyślna implementacja nie może zrobić tego, o co poprosisz niestety. – Strille

Odpowiedz

1

Zrób głęboki klon swojego obiektu (z biblioteką, taką jak low-dash), wykonaj to, co chcesz przycinać, a następnie przekaż je JSON.stringify. Nie próbowałbym ponownie wymyślać JSON.stringify, czyli wysiłku w niewłaściwym miejscu.

[EDIT] wygląda jak ktoś już zrobił, co pan sugeruje: JSON.stringify deep objects

Nie polecam tego jednak, ponieważ rodzimy JSON.stringify zawsze będzie szybsze i bardziej niezawodne

[EDIT] o to biblioteka, która wydaje się robić to, co chcesz: http://philogb.github.io/jit/static/v20/Docs/files/Core/Core-js.html# $ jit.json.prune

+0

Masz na myśli * klon o ograniczonej głębi *? – Bergi

+0

Tak, może to zrobić w ten sposób, może być bardziej wydajne niż kopiowanie i przycinanie –

2

chciałem stringify obiekt na pierwszym poziomie, nie w tym biblioteki innej firmy/za dużo kodu.

W przypadku, gdy spojrzeć na to samo, o to szybkie jeden-liner, aby to zrobić:

var json = JSON.stringify(obj, function (k, v) { return k ? "" + v : v; }); 

Przykład:

var obj = { 
 
    keyA: "test", 
 
    keyB: undefined, 
 
    keyC: 42, 
 
} 
 
obj.keyD = obj; 
 

 
var json = JSON.stringify(obj, function (k, v) { return k ? "" + v : v; }); 
 
console.log(json);

dodając pusty ciąg przed wartością, automatycznie rzuci wartość na ciąg. Musimy jednak sprawdzić klucz, aby się nie rzucał, gdy element ma wartość null lub jest niezdefiniowany.