sfcode
An Online Competing and Development Environment
|
This document describes operations performed to produce, or parse, the flatted output.
The output is always an Array
that contains at index 0
the given value.
If the value is an Array
or an Object
, per each property value passed through the callback, return the value as is if it's not an Array
, an Object
, or a string
.
In case it's an Array
, an Object
, or a string
, return the index as string
, associated through a Map
.
Giving the following example:
There is an input
containing [array, "a", "b"]
, where the array
has indexes "1"
and "2"
as strings, indexes that point respectively at "a"
and "b"
within the input [array, "a", "b"]
.
The exact same happens for objects.
Every object, string, or array, encountered during serialization will be stored once as stringified index.
This, performed before going through all properties, grants unique indexes per reference.
The stringified indexes ensure there won't be conflicts with regularly stored numbers.
Everything that is a string
is wrapped as new String
, but strings in the array, from index 1
on, is kept as regular string
.
The input
array will have a regular string
at index 1
, but its object at index 0
will have an instanceof String
as .a
property.
That is the key to place back values from the rest of the array, so that per each property of the object at index 0
, if the value is an instanceof
String, something not serializable via JSON, it means it can be used to retrieve the position of its value from the input
array.
If such value
is an object and it hasn't been parsed yet, add it as parsed and go through all its properties/values.
As summary, the whole logic is based on polluting the de-serialization with a kind of variable that is unexpected, hence secure to use as directive to retrieve an index with a value.
The usage of a Map
and a Set
to flag known references/strings as visited/stored makes flatted a rock solid, fast, and compact, solution.