0

我正在編寫一個應用程序,其中相同的數據結構保存了很多次。縮短的例子:將縮減的數據庫對象轉換爲可讀的鍵

user-xyz: { 
    displayName: 'Bla', 
    email: '[email protected]', 
    preferences: { 
     education: 'high' 
    } 
} 

爲了節省帶寬和數據庫存儲,我想「縮小」我的數據庫鍵:

user-xzy: { 
    dN: 'Bla', 
    e: '[email protected]' 
    p: { 
     e: 'high' 
    } 
} 

現在我有一個對象被從數據庫中精縮來的問題方式,我必須重新分配正確的'完整'鍵,所以我可以在我的應用程序中正常處理對象。我不想與縮小版本一起工作,因爲它會使新編碼器難以進入。

當我有兩個e(用於轉換)時,什麼是「翻譯」對象的好方法例如)作爲縮小的關鍵?我需要以某種方式將對象結構包含到我的邏輯中以選擇適當的完整鍵。

編輯: 克萊斯的答案解決了這個問題。現在我意識到,我有時使用較少密鑰的對象,因爲數據庫不會保存'空'值。 Redu的答案不再適用,因爲它使用了索引。不過,我可以修改自己的解決方案,因此當鑰匙丟失仍然有效:

// mapping object 
var userXYZ = { 
    displayName: 'dN', 
    email: 'e', 
    preferences: 'p', 
    p: { 
    education: 'e' 
    } 
}; 

var userXYZMin = { 
    dN: 'myName', 
    // e: '[email protected]', -> missing key 
    p: { 
    e: 'elementary' 
    } 
}; 

var restoreKeys = function (original, minified) { 
    return Object.keys(original) 
    .reduce(function (o, k) { 
     if (typeof original[k] !== "object") 
     o[k] = (typeof minified[original[k]] !== "object" 
      ? minified[original[k]] || "" 
      : restoreKeys(original[original[k]], minified[original[k]]) || {}); 
     return o; 
    }, {}); 
}; 

這只是對未來的搜索請求:)

回答

1

前提是你不必在同一水平的重複鍵那麼你可以這樣做:

function restoreKeys(original,minified){ 
 
    var oksm = Object.keys(minified); 
 
    return Object.keys(original) 
 
       .reduce((o,k,i) => typeof original[k] !== "object" ? (o[k] = minified[oksm[i]],o) 
 
                    : (o[k] = restoreKeys(original[k],minified[oksm[i]]),o),{}); 
 
} 
 

 
var userXYZ = { 
 
       displayName: 'Bla', 
 
        email: '[email protected]', 
 
       preferences: { 
 
          education: 'high' 
 
          } 
 
       }, 
 

 
userXYZMin = { 
 
       dN: 'myName', 
 
       e: '[email protected]', 
 
       p: { 
 
        e: 'elementary' 
 
        } 
 
      }, 
 

 
    restored = restoreKeys(userXYZ,userXYZMin); 
 
console.log(restored);

以下是ES5兼容的版本

function restoreKeys(original,minified){ 
 
    var oksm = Object.keys(minified); 
 
    return Object.keys(original) 
 
       .reduce(function(o,k,i){ 
 
       \t   var oksm = Object.keys(minified); 
 
       \t   o[k] = typeof original[k] !== "object" ? minified[oksm[i]] 
 
                   : restoreKeys(original[k],minified[oksm[i]]); 
 
         return o; 
 
         }, {}); 
 
} 
 

 
var userXYZ = { 
 
       displayName: 'Bla', 
 
        email: '[email protected]', 
 
       preferences: { 
 
          education: 'high' 
 
          } 
 
       }, 
 

 
userXYZMin = { 
 
       dN: 'myName', 
 
       e: '[email protected]', 
 
       p: { 
 
        e: 'elementary' 
 
        } 
 
      }, 
 

 
    restored = restoreKeys(userXYZ,userXYZMin); 
 
console.log(restored);

+0

這看起來不錯,但有可能在EC5呢? (在函數語法中) –

+1

@Yorick Tran當然......第二個片段應該是ES5兼容的。 – Redu

+0

具體而言,我不明白'(o [k] = minified [oksm [i]],o)'部分,是將「o」翻譯爲「|| o」? –

相關問題