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

Merge objects dynamically - Object Property Name Issue

本文关键字:对象 问题 合并 动态 属性      更新时间:2023-09-26

我正在尝试将对象合并在一起,或向现有对象添加新对象。我已经得到了它的工作,因为合并使用jQuery,但它的属性的名称,不会动态工作。

参数filters为对象,如{test:123}

调用filter({test:123});时,我希望filter函数动态地向全局对象添加对象。(当然不能使用push(),因为它不是一个数组)

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

问题是"key"变成了"key"作为属性名。什么时候应该用"test"作为属性名;我无法获得动态创建的属性名称。

目标是允许用户像这样触发函数:
filter({test:123,test2:1321,test55:4})

和动态地添加对象到全局设置对象,而不需要用户干预对象本身

您的代码不能工作,因为key在对象中直接设置时没有被解释为变量。

$.extend( settings.filter, {key:filters[key]} );
考虑:

var keyName = "Test";
var badObj = { keyName: "Hello World" };

调用newObj.Test时会得到undefined,因为它实际上是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);
};
演示

应该在extend:

之前创建临时对象
this.filter = function(filters) {
  for (var key in filters) {
    var obj = {};
    obj[key] = filters[key];
    $.extend( settings.filter, obj );
  }
};