在Javascript中创建深层嵌套对象

时间:2018-03-26 11:58:20

标签: 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[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;

3 个答案:

答案 0 :(得分:2)

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

var dbValue = commentDB.val();

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

答案 1 :(得分:1)

为什么不创建函数

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)

答案 2 :(得分:1)

在@ 31piy的建议之后,我选择了最简单的解决方案:

使用lodash _.set

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

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