我需要從JavaScript對象中創建校驗和。
不幸的是,由於JavaScript的對象排序,似乎沒有一種簡單的方法可以實現這一點。例如,拿這些對象:如何從JavaScript對象中創建校驗和?
var obj1 = {type:"cake",quantity:0}
, obj2 = {quantity:0,type:"cake"};
我認爲這些對象在數據上是相同的,並且希望它們的校驗和相同。只要數據中的數據是相同的,我真的不關心對象的順序。
唉,JSON.stringify
其實並不相等;作爲一個對象的校驗和的唯一方法是通過它的字符串表示形式和JSON.stringify
-ed表達式不相等,我的校驗和將不相等!
一個解決方案我想出了是基於預定義模式來重新創建對象,像這樣:
var schema = ["type","quantity"];
function sortify(obj,schema){
var n={};
for(i in schema)
n[schema[i]]=obj[schema[i]];
return n
}
運行JSON.stringify(sortify(obj1,schema))==JSON.stringify(sortify(obj2,schema))
將返回true
......但在創建新的對象和周圍洗牌的價格數據。
我的另一個解決方案是將JSON.stringify
方法替換爲從預定義模式中選取鍵並對其值進行串處理,然後將它們連接在一起的方法。 該功能可以讀取:
function smarterStringify(obj,schema){
var s="";
for(i in schema)
s+=JSON.stringify(obj[schema[i]]);
return s
}
忽略了一個事實,這個方法不返回正確的JSON(它足夠接近的什麼,我試圖做一個例子),它是在第一個大規模的改進在速度上(至少在我的Chrome操作系統瀏覽器中,你可以在這裏檢查它:http://jsperf.com/sort-then-json-stringify-vs-smarter-stringify),當然它使兩個對象字符串表示相等!
但是,我只是想知道我是否錯過了一些東西,並且有一種類似這樣的內置方法,但沒有a)將JavaScript GC驅動成病態的情況,或者b)做得太多字符串連接。 我寧願不要那樣做。
您不應該使用'for ... in'循環遍歷JavaScript中的數組。對索引變量使用簡單的'for'循環或使用'.forEach()'。 – Pointy
對象中的所有屬性值是簡單值還是可以是對象或數組(例如嵌套結構)? – jfriend00
@ jfriend00我打算在裏面有另一個對象,但這不是必需的 – striking