JSON bir Kümeyi stringify


110

Bir JSON.stringify () bir Set nasıl olur ?

Chromium 43'te çalışmayan şeyler:

var s = new Set(['foo', 'bar']);

JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"

Serileştirilmiş bir diziye benzer bir şey almayı beklerdim.

JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"

Yanıtlar:


117

JSON.stringify doğrudan kümelerle çalışmaz çünkü kümede depolanan veriler özellikler olarak depolanmaz.

Ancak kümeyi bir diziye dönüştürebilirsiniz. O zaman onu düzgün bir şekilde dizebileceksiniz.

Aşağıdakilerden herhangi biri işe yarayacaktır:

JSON.stringify([...s]);
JSON.stringify([...s.keys()]);
JSON.stringify([...s.values()]);
JSON.stringify(Array.from(s));
JSON.stringify(Array.from(s.keys()));
JSON.stringify(Array.from(s.values()));

2
Evlenme teklif edecektim Array.from(). Ama bu deyimsel olarak daha iyi görünüyor.
TaoPR

4
Sadece bazı referanslar eklemek için MDN'de bunun ve diğer ilgili tekniklerin bazı örnekleri var
Amit

5
Bir liste anlama da işe yarayabilir:JSON.stringify([_ for (_ of s)])
Whymarrh

1
Bunu yapmanın tüm harika yolları, ne yazık ki Chromium 43'te spread ve Array.from gibi kutudan çıktığı gibi çalışmıyorlar henüz uygulanmadı. Kurtarma için Babel'e benziyor.
MitMaro

2
Varsayılanı iyileştirmek için mevcut bir teklif Set.prototype.toJSON: github.com/DavidBruant/Map-Set.prototype.toJSON
Oncle Tom

35

Bu JSON.stringifydeğiştiriciyi kullanın :

(çünkü toJSONeski bir yapıdır ve daha iyi bir yaklaşım bir özel kullanmaktırreplacer , bkz. https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16 )

function Set_toJSON(key, value) {
  if (typeof value === 'object' && value instanceof Set) {
    return [...value];
  }
  return value;
}

Sonra:

const fooBar = { foo: new Set([1, 2, 3]), bar: new Set([4, 5, 6]) };
JSON.stringify(fooBar, Set_toJSON)

Sonuç:

"{"foo":[1,2,3],"bar":[4,5,6]}"

6
ES6'da kısaltılmış versiyon varJSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)
OzzyCzech

Karşılık gelen canlandırıcı okuyucu için bir alıştırma olarak mı bırakılır? ;-)
Robert Siemer

9

Yukarıdakilerin tümü çalışırken, alt sınıf ayarlamanızı ve toJSONdoğru şekilde dizildiğinden emin olmak için bir yöntem eklemenizi öneririm . Özellikle de sık sık zorlanacaksanız. Redux mağazalarımda setler kullanıyorum ve bunun asla bir sorun olmadığından emin olmam gerekiyordu.

Bu temel bir uygulamadır. Adlandırma, sadece kendi stilinizi seçmek noktayı göstermek içindir.

class JSONSet extends Set {
    toJSON () {
        return [...this]
    }
}

const set = new JSONSet([1, 2, 3])
console.log(JSON.stringify(set))

4
toJSONEski bir özellik olarak kabul edildiği için bu yaklaşımı tavsiye etmem . Her toJSONikisine de eklenecek setve mapreddedilen bir teklif : github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16
MitMaro

Geçersiz kılma constructorgerekli değildir.
Justin Johnson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.