在Javascript中创建深度嵌套对象

在Javascript中创建深度嵌套对象,javascript,json,object,properties,nested,Javascript,Json,Object,Properties,Nested,从服务器加载JSON时,我需要创建对象。对象并不总是预先存在。因此,在添加新级别之前,我必须检查每个级别是否存在。有没有更好的方法,然后是以下方法: var talkerId = commentDB.val().to; var commentId = commentDB.val().id if (!store.talkers.hasOwnProperty(talkerId)) { store.talkers[talkerId] = {} } if (!store.talkers[tal

从服务器加载JSON时,我需要创建对象。对象并不总是预先存在。因此,在添加新级别之前,我必须检查每个级别是否存在。有没有更好的方法,然后是以下方法:

var talkerId = commentDB.val().to;
var commentId = commentDB.val().id

if (!store.talkers.hasOwnProperty(talkerId)) {
    store.talkers[talkerId] = {}
}
if (!store.talkers[talkerId].hasOwnProperty(comments)) {
    store.talkers[talkerId] = { comments: {} };
}
if (!store.talkers[talkerId].comments.hasOwnProperty(commentId)) {
    store.talkers[talkerId].comments[commentId] = {}
}
store.talkers[talkerId].comments[commentId].author = commentDB.val().author;

您可以通过使用对象来减少密钥,并检查密钥是否存在。如果没有,请使用空对象创建新属性

var dbValue = commentDB.val();

[dbValue.to, 'comments', dbValue.id].reduce(
    (o, k) => o[k] = o[k] || {},
    store.talkers
).author = commentDB.val().author;

为什么不创建一个函数呢

function checkAndCreateProperty(arr, baseVar) {
   for(var i = 0; i < arr.length; i++) {
       if (!baseVar.hasOwnProperty(arr[i])) {
           baseVar[arr[i]] = {};
      }
      baseVar = baseVar[arr[i]];
   }
}


checkAndCreateProperty(["talkerId", "comments", commentDB.val().id, commentDB.val().author], store.talkers)
函数checkAndCreateProperty(arr,baseVar){
对于(变量i=0;i
在@31piy的建议下,我选择了最简单的解决方案:

使用lodash u0.set

var talkerId = commentDB.val().to;
var commentId = commentDB.val().id;

_.set(store.talkers, '[' + talkerId + '].comments[' + commentId + '].author', commentDB.val().author)

请参阅。您是否可以简单地从服务器返回JSON,然后使用
JSON.parse()
转换为对象?我无法从服务器返回,因为我连接了两个数据字段,并在客户端创建了组合的JSON。因此,您对服务器进行了两次调用,每次调用一个DB,然后您将两个数据集返回给客户端,并将它们合并到一个对象中?@31piy,它完成了任务:-)谢谢,非常酷,但是reduce的逻辑我发现在维护代码时很难遵循