2015-05-21 96 views
-2

隨着拼合基於一次性密鑰

{ _id: "123", super: { super: { super: { someString: "here", someOtherString: "here", someObject: { withSomeContents: true }}}}}

水平具有超強的鍵可以有任意的深度,我想他們和他們的內容中的每一個被壓平,這樣才能得到

{ _id: "123", someString: "here", someOtherString: "here", someObject: { withSomeContents: true }}

這樣做的好方法是什麼?最好使用下劃線。

+0

只是好奇 - 你是怎麼設法獲得像我們現在看到的是什麼對象? –

+0

定義你的問題好一點。那麼,你是否只希望從最深層次的物業變成最高層?或者是否有可能需要平整的中間層次的其他屬性?有些屬性名稱可能會衝突嗎?那將如何處理? –

+0

定義「好方法」。有一個明顯的例子,即使用顯式迭代也不算太長。 –

回答

3

您需要遞歸合併對象,同時檢查所需的關鍵:

var data = { 
 
    _id: "123", 
 
    super: { 
 
    super: { 
 
     super: { 
 
     someString: "here", 
 
     someOtherString: "here", 
 
     someObject: { 
 
      withSomeContents: true 
 
     } 
 
     } 
 
    } 
 
    } 
 
}; 
 

 
function merge(dest, src) { 
 
    Object.keys(src).forEach(function(key) { 
 
    dest[key] = src[key]; 
 
    }); 
 
} 
 

 
function flattenKey(data, flatKey) { 
 
    return Object.keys(data).reduce(function(obj, key) { 
 
    if (key === flatKey) { 
 
     merge(obj, flattenKey(data[key], flatKey)); 
 
    } else { 
 
     obj[key] = data[key]; 
 
    } 
 
    return obj; 
 
    }, {}); 
 
} 
 

 
document.getElementById('r').textContent = JSON.stringify(flattenKey(data, 'super'));
<pre id=r></pre>

+0

非常好。非常感謝你。嘗試搜索,但不知道是否有一些經常使用的方法,如下劃線或類似的鏈。 – jiku