2016-11-13 55 views
1

我具有包含序列HTMLFormElement(2維)的preformated屬性名稱的對象:轉換方括號表示法爲對象

var plain = { 
    id: 1, 
    'items[A][Z]': 2, 
    'items[B]': false, 
    'items[C][][A]': 1 
} 

我想通過創建各自的子對象(或多個)將對象轉換:

var result = { 
    id: 1, 
    items: { 
     A: {Z:2}, 
     B: false, 
     C: [ {A:1} ] 
    } 
} 

據我所知,這是一種常見的做法 - 但我無法找到有關該主題的更多資源。通常稱爲什麼樣的東西,以及將plain轉換爲result的最佳方法是什麼?

編輯:我更新了一個Array的例子。這似乎是相關的,並且也受快遞的body-parser的支持。

+0

爲什麼downvote? –

回答

2

你可能分裂的路徑和步行給定對象減少的路徑。如果沒有對象存在,請使用名稱創建一個新屬性,稍後分配值並刪除拆分的屬性。

var plain = { id: 1, 'items[A][Z]': 2, 'items[B]': false }; 
 

 
Object.keys(plain).forEach(function (k) { 
 
    var path = k.replace(/\[/g, '.').replace(/\]/g, '').split('.'), 
 
     last = path.pop(); 
 

 
    if (path.length) { 
 
     path.reduce(function (o, p) { 
 
      return o[p] = o[p] || {}; 
 
     }, plain)[last] = plain[k]; 
 
     delete plain[k]; 
 
    } 
 
}); 
 

 
console.log(plain);

ES6

var plain = { id: 1, 'items[A][Z]': 2, 'items[B]': false }; 
 

 
Object.keys(plain).forEach(k => { 
 
    var path = k.replace(/\[/g, '.').replace(/\]/g, '').split('.'), 
 
     last = path.pop(); 
 

 
    if (path.length) { 
 
     path.reduce((o, p) => o[p] = o[p] || {}, plain)[last] = plain[k]; 
 
     delete plain[k]; 
 
    } 
 
}); 
 

 
console.log(plain);

+0

這個非常有用,謝謝!我現在試圖實現空方括號('[]')來創建數組(請參閱更新後的問題) - 但我被卡在reduce的return處,它似乎只適用於子對象 - 你會給我有提示嗎?或者應該在減少陣列之前完成它? –

+1

我建議將系統更改爲數組括號內的對象和數字的命名屬性,如'plain.c [3]',其中c是數組,3是數組的索引,您可以看一下[這裏](http://stackoverflow.com/questions/40131843/accessing-or-creating-nested-javascript-objects-with-string-key-without-eval) –

+0

正是我需要的,丹科! [JSFiddle](https://jsfiddle.net/RienNeVaPlus/3bfLfdhn/)我現在正在使用的。 –

1

你可以這樣使用reduce()filter()

var plain = { 
 
    id: 1, 
 
    'items[A][Z]': 2, 
 
    'items[B]': false 
 
} 
 

 
var obj = {} 
 
var result = Object.keys(plain).reduce(function(r, e) { 
 
    if (e.match(/\[(.*?)\]/gi)) { 
 
    var keys = e.split(/\[(.*?)\]/gi).filter(e => e != ''); 
 
    keys.reduce(function(a, b, i) { 
 
     return (i != keys.length - 1) ? a[b] || (a[b] = {}) : a[b] = plain[e]; 
 
    }, obj) 
 
    } else { 
 
    obj[e] = plain[e]; 
 
    } 
 
    return r; 
 
}, obj) 
 

 
console.log(result)

相關問題