繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM