我尝试将对象合并在一起,或者将新对象添加到现有对象中。 我已经使用jQuery将其用于合并,但它是不能动态工作的属性的名称。
参数filters
是一个对象,例如{test:123}
。
调用filter({test:123});
时,我希望filter
函数动态地将对象添加到全局对象。 (当然不能使用push()
,因为它不是数组)
this.filter = function(filters) {
for (var key in filters) {
$.extend( settings.filter, {key:filters[key]} );
}
};
问题在于"关键"变成"关键"作为财产的名称。什么时候应该"测试"作为财产名称;我无法动态创建属性名称。
目标是允许用户像这样触发函数:
filter({test:123,test2:1321,test55:4})
并动态地将对象添加到全局设置对象,而无需用户干涉对象本身。
答案 0 :(得分:1)
您的代码不起作用,因为在对象中直接设置键时,键不会被解释为变量。
$.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);
}
}
};
请记住,您可以简化此操作并使用extend方法。这样会更好,除非您希望按方法名称建议进行自己的过滤。
this.filter = function(filters) {
$.extend(settings.filter, filters);
};
答案 1 :(得分:0)
你应该在扩展之前创建temp obj:
this.filter = function(filters) {
for (var key in filters) {
var obj = {};
obj[key] = filters[key];
$.extend( settings.filter, obj );
}
};