使用javascript /下划线编辑对象,如果不存在则添加新项目

时间:2015-03-06 15:09:16

标签: javascript underscore.js

所以我在拉一个我想要“编辑”的对象,有一点帮助我有一个函数找到我正在寻找的项目并替换了值。在构建此项目时我没有考虑到的是项目是否尚不存在。

所以现在这个函数看起来像这样:

   myFunction = function(moduleName, stateName, startVar){
    //currentState brought in from factory controlling it
     var currentState = StateFactory.current();
    _.each(currentState, function(item) {
                if (item.module === moduleName) {
                  _.each(item.customUrl, function(innerItem) {
                    if (_.has(innerItem, stateName)) {
                      innerItem[stateName] = startVar;
                    }
                  });
                }
              });  
   }

所以 - 假设它已经存在,这在替换startVar值方面做得很好。我需要添加一些级别的检查以确保项目存在(如果它们没有添加它们)。

因此,作为参考,这就是currentState的样子

 [{
 "module": "module1",
 "customUrl": [
    { "mod1": "2" },
    { "mod2": "1" }
]
 }, {
"module": "module2",
"customUrl": [
    { "mod3": "false" },
    { "mod4": "5" }
]
 }
 ];

所以,如果我通过了

 myFunction("module1","mod1",3);

这很有效,但是如果我通过

myFunction("module5","mod8","false");

或许可能介于两者之间

 myFunction("module1","mod30","false");

此功能无法处理该情况。我可以用一些帮助缠绕我的头来解决这个问题。此外,我使用下划线(如果需要帮助)。感谢您抽出宝贵时间阅读!

正如Phari所提到的 - 这就是

的影响
  currentState[moduleName].customUrl[stateName] = startVar;

我原以为我可以创建对象而只是_.extend,但因为它是一个对象数组不能正常工作。

这就是我的意思:

  var tempOb = {"module" : moduleName, "customUrl" : [{stateName : startVar}]};

  _.extend(currentState, tempOb);

对于一组对象不能正常工作。

1 个答案:

答案 0 :(得分:1)

您似乎需要删除if语句:

                if (_.has(innerItem, stateName)) {
                  innerItem[stateName] = startVar;
                }

应该变得简单:

                  innerItem[stateName] = startVar;

然后,如果该属性不存在,则会添加该属性。如果它已经存在,它将被覆盖。

编辑:处理最高级别的缺席:

myFunction = function(moduleName, stateName, startVar){
//currentState brought in from factory controlling it
 var currentState = StateFactory.current();
 var found = false;
_.each(currentState, function(item) {
            if (item.module === moduleName) {
              found = true;
              _.each(item.customUrl, function(innerItem) {
                if (_.has(innerItem, stateName)) {
                  innerItem[stateName] = startVar;
                }
              });
            }
          });  
    if ( ! found ) {
        var newItem = {
            module: moduleName,
            customUrl: []
        };
        var newInnerItem = {};
        newInnerItem[stateName] = startVar;
        newItem.customUrl.push(newInnerItem);
        currentState.push(newItem);
    }
}