将对象插入未知对象路径
Insert an object into unknow object path
我想将一个对象插入一个预定义的对象:
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");
相关文章:
- 计算从一个对象到另一个对象的路径并沿其移动
- 如何将字符串附加到对象中'路径'在Javascript中
- 检索对象项的路径
- Raphael JS选择路径/对象/节点的特定实例
- 构造嵌套对象的路径
- 从一个复杂的JSON对象打印每个JSON输入路径
- 改变<svg>对象's路径
- 从表单中派生要使用javascript对象加载的图像路径
- 获取“;路径“;JavaScript中的JSON对象
- 从react routers browserHistory对象获取当前页面路径
- lodash 表示“按对象路径选择”
- 从类似对象路径的数据中检索属性#0.elements.#0.name”;
- 如何使用Raphael在SVG中放置对象/路径的阴影
- 通过递归将嵌套json对象路径保存到变量
- 如何在Paper.js中从层中销毁特定(而不是删除)对象/路径/分组子对象
- Js在属性分配中构建对象路径
- 用变量构建对象路径
- Firefox在使用jsonPath查询对象路径时速度比Chrome慢
- 将对象插入未知对象路径
- 使用交集库检测对象/路径并对其应用限制