/ Düzleştirmek için en hızlı yolu-dümdüz BM JSON nesneleri iç içe
Bazı kod birlikte dümdüz attım ve BM dümdüz karmaşık/JSON nesneleri iç içe. Çalışıyor ama biraz yavaş Tetikleyicileri ('uzun script' uyarı).
İstiyorum basık isimleri "." sınırlayıcı olarak ve [INDEX] diziler için.
Örnekler:
un-flattened | flattened
---------------------------
{foo:{bar:false}} => {"foo.bar":false}
{a:[{b:["c","d"]}]} => {"a[0].b[0]":"c","a[0].b[1]":"d"}
[1,[2,[3,4],5],6] => {"[0]":1,"[1].[0]":2,"[1].[1].[0]":3,"[1].[1].[1]":4,"[1].[2]":5,"[2]":6}
~Kullanın benim davam http://jsfiddle.net/WSzec/ benzeyen bir kriter oluşturdum
- İç içe, JSON nesnesi almak
- Düzeltin
- Bir göz atın ve basık olsa muhtemelen onu değiştir
- Orijinal iç içe biçimine geri çekil sevk edilecek Unflatten
İsterim daha hızlı kod: açıklama, kod tamamlar JSFiddle kriter (http://jsfiddle.net/WSzec/) önemli ölçüde daha hızlı (~20% güzel olurdu) IE 9 , 24 FF , ve Krom 29 .
İşte ilgili JavaScript kodu: Mevcut en Hızlı: http://jsfiddle.net/WSzec/6/
JSON.unflatten = function(data) {
"use strict";
if (Object(data) !== data || Array.isArray(data))
return data;
var result = {}, cur, prop, idx, last, temp;
for(var p in data) {
cur = result, prop = "", last = 0;
do {
idx = p.indexOf(".", last);
temp = p.substring(last, idx !== -1 ? idx : undefined);
cur = cur[prop] || (cur[prop] = (!isNaN(parseInt(temp)) ? [] : {}));
prop = temp;
last = idx 1;
} while(idx >= 0);
cur[prop] = data[p];
}
return result[""];
}
JSON.flatten = function(data) {
var result = {};
function recurse (cur, prop) {
if (Object(cur) !== cur) {
result[prop] = cur;
} else if (Array.isArray(cur)) {
for(var i=0, l=cur.length; i<l; i )
recurse(cur[i], prop ? prop "." i : "" i);
if (l == 0)
result[prop] = [];
} else {
var isEmpty = true;
for (var p in cur) {
isEmpty = false;
recurse(cur[p], prop ? prop "." p : p);
}
if (isEmpty)
result[prop] = {};
}
}
recurse(data, "");
return result;
}
1 DÜZENLEYİNDeğiştirilmiş @Bergi için yukarıdaki 'şu anda en hızlı olan hayata geçirilmesi. Bir kenara olarak, "kullanılması.""düzenli ifade.yerine adres bilgisi exec" civarında daha hızlı FF ama daha yavaş Krom; yani sopa ile düzenli beri daha kolaydır (işte benim girişimi kullanarak adres bilgisi değiştirmek için düzenli ifade http://jsfiddle.net/WSzec/2/).
2 DÜZENLEYİN@Üzerinde bina 'başardım fikri olmayan düzenli daha hızlı bir şekilde kullanılabilir s (daha hızlı ve ~10% FF Chrome daha hızlı 3x). Bergi (Geçerli) bu uygulama http://jsfiddle.net/WSzec/6/ anahtar adları sade kuralları, bir tam sayı ile başlamak ya da bir süre içeremez anahtarları.
Örnek:
- {"": {"":[0]} bar} =>foo {"foo.bar.":0} 0
3 DÜZENLEMEK@Ekleme AaditMShah 's satır içi yolu ayrıştırma yaklaşımı (yerine Dize.split) unflatten performansını artırmak için yardımcı oldu. Genel performans iyileştirme ulaştı çok mutluyum.
En son jsfiddle ve jsperf:
CEVAP
Burada çok daha kısa benim uygulama:
JSON.unflatten = function(data) {
"use strict";
if (Object(data) !== data || Array.isArray(data))
return data;
var regex = /\.?([^.\[\]] )|\[(\d )\]/g,
resultholder = {};
for (var p in data) {
var cur = resultholder,
prop = "",
m;
while (m = regex.exec(p)) {
cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));
prop = m[2] || m[1];
}
cur[prop] = data[p];
}
return resultholder[""] || resultholder;
};
JSON.flatten çok değişmiş (ve gerçekten isEmpty Bu durumda gerekli olup olmadığını emin değilim) yok:
JSON.flatten = function(data) {
var result = {};
function recurse (cur, prop) {
if (Object(cur) !== cur) {
result[prop] = cur;
} else if (Array.isArray(cur)) {
for(var i=0, l=cur.length; i<l; i )
recurse(cur[i], prop "[" i "]");
if (l == 0)
result[prop] = [];
} else {
var isEmpty = true;
for (var p in cur) {
isEmpty = false;
recurse(cur[p], prop ? prop "." p : p);
}
if (isEmpty && prop)
result[prop] = {};
}
}
recurse(data, "");
return result;
}
Birlikte, onlar yaklaşık yarısında run your benchmark (Opera 12.16: ~ 1900ms, Krom 29 yerine ~900ms: ~1600ms yerine ~800ms).

Eğer bir dize PHP JSON olup olmadığını...
Bir tamsayı'in kare kökü belirlem...
Hızlı eğer bir tam sayı iki tamsayı (d...
Hızlı dize PHP bir tamsayı dönüştürmek...
Πdeğerini almak için en hızlı yolu ne...