动态合并对象 - 对象属性名称问题

时间:2014-06-21 18:02:24

标签: javascript jquery javascript-objects

我尝试将对象合并在一起,或者将新对象添加到现有对象中。 我已经使用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})

并动态地将对象添加到全局设置对象,而无需用户干涉对象本身。

2 个答案:

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

Demos

答案 1 :(得分:0)

你应该在扩展之前创建temp obj:

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