2014-06-21 27 views
1

我试图合并对象,或者将新对象添加到现有对象。 我已经得到它使用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}) 

和动态对象添加到全局设置对象,而用户与对象本身插手。

+1

你为什么做这样的说法,而不是仅仅'$ .extend(settings.filter,过滤器)'? –

+0

......你描述的问题的确切原因很简单,对象初始值设定语法不可能知道你实际上想要使用'key'变量的值而不是名为'key'的实际标识符的值。有关StackOverflow的许多问题都解决了如何使用动态密钥创建对象,但这一切都在旁边,因为您的方法并不是首先要做到的。 –

+0

@cookiemonster谢谢。我不知道为什么我试图做到这一点,我正在考虑数组,通常在PHP我foreach或循环它们在一起,但$。扩展(settings.filter,filters);解决了这个问题,使其变得简单。谢谢。 – timothymarois

回答

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

请记住,您可以简化这只是使用扩展方法。这样会更好,除非你正在按照方法名称的建议去做自己的过滤。

this.filter = function(filters) { 
    $.extend(settings.filter, filters); 
}; 

Demos

+0

谢谢。只是运行扩展的简单方法, $ .extend(settings.filter,filters);完美地工作。 似乎我试图编写像我在做php数组。 – timothymarois

0

你应该创建临时OBJ之前延长:

this.filter = function(filters) { 
    for (var key in filters) { 
    var obj = {}; 
    obj[key] = filters[key]; 
    $.extend(settings.filter, obj); 
    } 
};