将缩小的数据库对象转换为可读键
Transform minified database object to readable keys
我正在编写一个应用程序,其中保存了很多次相同的数据结构。缩短示例:
user-xyz: {
displayName: 'Bla',
email: 'bla@gmx.com',
preferences: {
education: 'high'
}
}
为了节省带宽和数据库存储空间,我想 'minify' 我的数据库密钥为:
user-xzy: {
dN: 'Bla',
e: 'bla@gmx.com'
p: {
e: 'high'
}
}
现在我遇到了对象以缩小的方式来自数据库的问题,我必须重新分配正确的 'full' 键,这样我才能在我的应用程序中正常使用该对象。我不想使用缩小版本,因为它会让新编码员更难加入。
当我有两个 e(例如)作为缩小键时,'translate' 对象的好方法是什么?我需要以某种方式将对象结构包含到我的逻辑中,以 select 适当的全键。
编辑:
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);
我正在编写一个应用程序,其中保存了很多次相同的数据结构。缩短示例:
user-xyz: {
displayName: 'Bla',
email: 'bla@gmx.com',
preferences: {
education: 'high'
}
}
为了节省带宽和数据库存储空间,我想 'minify' 我的数据库密钥为:
user-xzy: {
dN: 'Bla',
e: 'bla@gmx.com'
p: {
e: 'high'
}
}
现在我遇到了对象以缩小的方式来自数据库的问题,我必须重新分配正确的 'full' 键,这样我才能在我的应用程序中正常使用该对象。我不想使用缩小版本,因为它会让新编码员更难加入。
当我有两个 e(例如)作为缩小键时,'translate' 对象的好方法是什么?我需要以某种方式将对象结构包含到我的逻辑中,以 select 适当的全键。
编辑: 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);