将缩小的数据库对象转换为可读键



我正在编写一个应用程序,其中相同的数据结构被保存了很多次。缩短的例子:

user-xyz: {
   displayName: 'Bla',
   email: 'bla@gmx.com',
   preferences: {
       education: 'high'
   }
}

为了节省带宽和数据库存储空间,我想将我的数据库键"最小化"到:

user-xzy: {
   dN: 'Bla',
   e: 'bla@gmx.com'
   p: {
       e: 'high'
   }
}

现在我有一个问题,对象以一种缩小的方式来自数据库,我必须重新分配正确的'full'键,所以我可以在我的应用程序中正常使用对象。我不想使用缩小的版本,因为它会使新编码人员更难进入。

当我有两个e(例如)作为一个缩小的键时,什么是"翻译"对象的好方法?我需要以某种方式将对象结构包含到我的逻辑中,以选择适当的完整键。

编辑:

Redu的回答解决了这个问题。现在我意识到,我有时会有键数较少的对象,因为数据库不会保存'null'值。Redu的答案不再有效了,因为它利用了索引。然而,我能够修改他的解决方案,使其在缺少键时仍然有效:

// mapping object
var userXYZ = {
  displayName: 'dN',
  email: 'e',
  preferences: 'p',
  p: {
    education: 'e'
  }
};
var userXYZMin = {
  dN: 'myName',
  // e: 'myName@gmx.com', -> 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;
    }, {});
};

这只是为了将来的搜索请求:)

如果没有相同级别的重复密钥,则可以执行以下操作;

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: 'bla@gmx.com',
               preferences: {
                             education: 'high'
                            }
              },
userXYZMin = {
              dN: 'myName',
               e: 'myName@gmx.com',
               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){
               	         var oksm = Object.keys(minified);
               	         o[k] = typeof original[k] !== "object" ? minified[oksm[i]]
                                                                : restoreKeys(original[k],minified[oksm[i]]);
                         return o;
                       }, {});
}
var userXYZ = {
               displayName: 'Bla',
                     email: 'bla@gmx.com',
               preferences: {
                             education: 'high'
                            }
              },
userXYZMin = {
              dN: 'myName',
               e: 'myName@gmx.com',
               p: {
                   e: 'elementary'
                  }
             },
  restored = restoreKeys(userXYZ,userXYZMin);
console.log(restored);

最新更新