我有一些相當循環結構的Javascript對象,這些對象計算起來相對昂貴。我希望能夠在源代碼中將它們表示爲(幾乎)文字,以便它們不需要重新計算。有一個類庫函數的例子,我正在尋找幾個段落。在JavaScript中常量(理想字面)圓形對象的表示形式
曾經有人爲此提出了一些表示法,sharp variables,但他們只在舊版本的Firefox中受到支持。
當然,如果對象有任何循環引用,則對象不能被表示爲文字,所以我想將一個Javascript對象轉換爲一些代碼以便創建一個小函數。然後可以將其手動複製到要使用的源文件中。
爲了舉例,我將調用我正在尋找的函數print
。我希望的行爲大致是這樣的:
console.log(print({a:1,b:{c:2,d:3}})); // {a:1,b:{c:2,d:3}} (a string)
var obj = [null,null];
obj[0]=obj[1]=obj; //with sharp variables: obj = #1=[#1#,#1#]
console.log(print(obj));
// e.g. (function(){var u=void 0,a1=[u,u];a1[0]=a1;a1[1]=a1;return a1;})()
var obj = {a:1,
some:{b:2,
nested:{c:3,
cyclic:{d:4}}}};
obj.some.nested.cyclic.structure = obj;
//obj = #1={a:1,some:{b:2,nested:{c:3,cyclic:{d:4,structure:#1#}}}}
console.log(print(obj));
//e.g. (function(){var u=void 0,a1={a:1,some:{b:2,nested:{c:3,cyclic:{\
// d:4,structure:u};a1.some.nested.cyclic.structure=a1;return a1;})()
//OR e.g. (function(){var u=void 0,a1={a:1,some:u},a2={b:2,nested:u},...
// a1.some=a2;a2.nested=a3;a3.cyclic=a4;a4.structure=a1; return a1;})()
從本質上講,任何對象只取得了JS primatives /平的對象/數組,我們應該有一個eval(print(x))
在結構(深即)等於x
但不完全相同。換句話說,eval(print(x))
將是一個(愚蠢)的方式來做一個x
深深的副本(但尊重週期)
我寧願更像第一個選項比第二個選項。據推測,一些漂亮的印刷也可以實現,但這是可選的。我也不太在意使用void 0
而不是未定義的小細節。
我知道庫存在可以串行化循環對象的庫,但是它們會在普通樹形結構JavaScript對象內部執行一些自定義符號,因此它們需要額外的代碼才能進行反序列化。我不需要這個,所以我希望避免它。
我想,如果你能夠打印的對象,以敏銳的變量符號,你可以合理地容易將此轉換爲表格像上面如下:無需重複如#1=
- 打印用鋒利的變量( ,等)
- 計數使用的不同尖銳變量的數量。
- 爲每個名稱設置一個Javascript變量名稱,例如
a1
也可能是根的名稱。 - 未定義替換所有
#n#
,跟蹤他們的地方在樹 - 每個
#n#
產生這樣的代碼:an['path'][1]['to']['object'] = am
- 添加return語句的根。
然而,它似乎不太可能存在某些庫來打印具有尖銳變量的對象,而不是直接打印代碼。
不錯的問題。但爲什麼??我沒有看到任何需要尖銳的變量... –
@Jonasw,因爲有些情況下,圓形對象是有用的。在我的情況下,它們也是恆定的,但計算起來相對昂貴。在最一般的情況下,可能需要一個(循環)圖來進行計算。 –