[英]Merge objects dynamically - Object Property Name Issue
我正在尝试将对象合并在一起,或将新对象添加到现有对象。 我已经可以使用jQuery进行合并,但是它是无法动态工作的属性的名称。
参数filters
是一个对象,例如{test:123}
。
调用filter({test:123});
,我希望filter
功能将对象动态添加到全局对象。 (当然不能使用push()
因为它不是数组)
this.filter = function(filters) {
for (var key in filters) {
$.extend( settings.filter, {key:filters[key]} );
}
};
问题在于“键”变成了“键”作为属性的名称。 何时应以“ test”作为属性名称; 我无法获得要动态创建的属性名称。
目的是允许用户触发如下功能:
filter({test:123,test2:1321,test55:4})
并动态地将对象添加到全局设置对象,而无需用户干预对象本身。
您的代码无法正常工作,因为直接在对象中设置键时,键不会被解释为变量。
$.extend( settings.filter, {key:filters[key]} );
考虑到:
var keyName = "Test";
var badObj = { keyName: "Hello World" };
调用newObj.Test
时会得到未定义的,因为它实际上是newObj.keyName
。
为了使用变量创建属性名称,您需要使用其他语法。
var keyName = "Test";
var newObj = {};
newObj[keyName] = "Hello World";
然后,您可以引用并使用newObj.Test
来获取“ Hello World”
要修复您提供的方法,可以将其调整为:
this.filter = function(filters) {
for (var key in filters) {
if (filters.hasOwnProperty(key)) {
var newObj = {};
newObj[key] = filters[key];
$.extend(settings.filter, newObj);
}
}
};
请记住,您可以简化此过程,只需使用扩展方法即可。 除非您正在按照方法名称的建议进行自己的过滤,否则这样做会更好。
this.filter = function(filters) {
$.extend(settings.filter, filters);
};
您应该在扩展之前创建临时obj:
this.filter = function(filters) {
for (var key in filters) {
var obj = {};
obj[key] = filters[key];
$.extend( settings.filter, obj );
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.