【问题标题】:Insert an object into unknow object path将对象插入未知对象路径
【发布时间】:2014-04-29 16:18:28
【问题描述】:

我想将一个对象插入到一个预定义的对象中:

var obj = {
    "scripts": {
        "libs":{}
    },
    "plugins":{}
}

//....

function addobj(path, obj){

    console.log(path); // Object {libs: Object}..
    path.push(obj); // TypeError: undefined is not a function

}

// Test cases:
addobj(obj["scripts"],{"test":{}});

console.log(obj);

但是出现错误:TypeError: undefined is not a function为什么会这样?

http://jsfiddle.net/Qn3Tb/

【问题讨论】:

  • Path是一个对象,push是一个Array方法

标签: javascript jquery html object


【解决方案1】:

使用jQuery,可以使用$.extend():

demo

$.extend(path,obj);

【讨论】:

    【解决方案2】:

    你不能.push 到一个对象上。对象是键值存储,因此您需要为要存储在父对象上的对象(值)分配键。您如何实现这一目标是另一个问题,但这样的事情可能会奏效:

    function addobj(path, obj, key) {
        path[key || "unnamed"] = obj;
    }
    

    如果您想将libs 添加到scripts,您可以执行以下操作:

    addobj(script, libs, "libs");
    

    但是考虑到这个addobj 方法实际上做了什么,我的建议是完全放弃抽象,它不是必需的。

    【讨论】:

      【解决方案3】:

      为什么不干脆做

      function addProp(prop, value, targetObject){
          targetObject[prop] = value;
      }
      
      addProp('scripts', { test:{}}, obj);
      

      根据您的问题,您可以使用它来定位特定属性:

      var obj = {
          "scripts": {
              "libs":{
                  "labs": {
                      foo: 1
                  }
              }
          },
          "plugins":{}
      };
      
      function setPropByString(obj, propString, value) {
          if (!propString)
              return obj;
      
          var prop, props = propString.split('.');
      
          for (var i = 0, iLen = props.length - 1; i < iLen; i++) {
              prop = props[i];
      
              var candidate = obj[prop];
              if (candidate !== undefined) {
                  obj = candidate;
              } else {
                  break;
              }
          }
      
          obj[props[i]] = value;
      }
      
      setPropByString(obj, 'scripts.libs.labs', { something: 1 });
      
      console.log(obj);
      

      请注意,这将覆盖现有的道具。因此,使用 jQuery 进行扩展可能更容易,例如 @A.WolffSuggest。

      http://jsfiddle.net/Mn45R/

      【讨论】:

      • 如果我想将它添加到脚本 -> 库
      【解决方案4】:

      您不能按照问题中提到的方式执行此操作。

      我相信你应该创建一个函数,比如

      function Node(key) {
          var currentNode = this;
      
          this.getKey = function() {
              return key;
          };
      
          var children = [];
      
          this.addNode(childKey) {
              children[children.length] = new Node(childKey);
          }
      
          this.search(searchKey) {
              if (searchKey === key) {
                  return currentNode;
              }
              for (var childIndex in children) {
                  var searchResult = children[childIndex].search(searchKey);
                  if (!!searchResult) {
                      return searchResult;
                  }
              }
              return null;
          }
      }
      

      您可以通过这种方式创建您的根目录:

      var root = new Node();
      

      您可以通过这种方式将孩子添加到根目录:

      root.addNode("scripts");
      

      该函数可用于将某个节点添加到另一个具有键的节点

      function addNodeToTree(tree, key, newKey) {
          var node = tree.search(key);
          if (!!node) {
              node.addNode(new Node(newKey));
              return true;
          }
          return false;
      }
      

      最后,你可以像这样添加一个节点:

      addNodeToTree(root, "scripts", "test");
      

      【讨论】:

        猜你喜欢
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        相关资源
        最近更新 更多