将对象插入未知对象路径

Insert an object into unknow object path

本文关键字:对象 路径 未知 插入      更新时间:2023-09-26

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

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/

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

演示

$.extend(path,obj);

不能将.push拖到对象上。对象是键值存储,因此需要为要存储在父对象上的对象(值)分配一个键。如何实现这一点是另一个问题,但类似的方法可能会奏效:

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

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

addobj(script, libs, "libs");

然而,考虑到addobj方法的实际作用,我的建议是完全放弃抽象,这是不需要的。

为什么不简单地进行

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);

请注意,这将覆盖现有道具。因此,使用像@A这样的jQuery进行扩展可能更容易。Wolff建议。

http://jsfiddle.net/Mn45R/

你不能用问题中提到的方法来做这件事。

我认为你应该创建一个函数,比如

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");