将动态数组分配给对象

时间:2014-12-02 16:10:17

标签: javascript arrays object

我想将以下有效负载传递给API

params[field1]: value1
params[field2]: value1
....
params[fieldN]: valueN

我有来自对象的字段和值。

var params = {};
jQuery.each($scope.linkParams, function(a, b) {
    params.params[a] = b; // returns undefined variable error
    // I also tried other options but all result in one or another error
    // Some doesn't result into an erro but doesn't get merged. See below merge requirement
});

我还想将上面创建的对象与

合并到另一个对象
jQuery.extend(extraParams, params);

如何实现所获得的对象?

更新

$scope.linkParams = {
    field1: 'value1',
    field2: 'value2',
....
};

2 个答案:

答案 0 :(得分:0)

你有两个问题,所以我会一次解决一个问题。

(对于TL; DR,我对解决方案文本进行了大胆处理。但希望其余部分值得阅读。)

对象序列化非常神奇,但不是那么神奇

如果我有一个JS对象,我实例化如下:

var cat = {
  'meow': 'loud',
  'type': 'Persian',
  'sex': 'male'
}

那么你可以免费获得属性参考。也就是说,您可以说cat.meow之类的东西,并且您的运行时环境将理解这一点。但是,JS不会自动创建您引用的对象的属性不存在,除非您引用它们来创建它们。

cat.health = 'meek'可行,但cat.ears[0] = 'pointy'不会。

var cat = {
  'meow': 'loud',
  'type': 'Persian',
  'sex': 'male'
}
cat.health = 'meek'
alert(cat.health)

cat.ears[0] = 'pointy'
alert(cat.ears[0])
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

您会注意到第一个警报发生并包含预期值,但第二个警报永远不会出现。这是因为代码在cat.ears[0] = 'pointy'的行上失败,并且在那时停止执行。

这似乎与我刚才所说的相矛盾,但仔细观察正在发生的事情。当我们尝试初始化cat.ears的第一个元素时,我们必须引用不存在的cat.ears属性。

JS实现不会假设你想要永久地创建链上的项目,这可能是设计 - 如果它没有抛出错误,而只是创建了任何需要存在的属性或对象,以便你的通过语法合理的程序,当许多软件未能包含所需的库时,它们会默默地破坏。如果您忘记包含JQuery,它只需创建一个$,一个JQuery变量,以及您在代码中引用的那些对象的所有属性。这是一个适当的混乱调试。

简而言之,这就是你 - 可能是偶然的 - 假设会在这里工作。 params.params类似于上例中的cat.ears。您可能有一些理由这样做,但假设您没有这样做,如果您只是将params.params[a]更改为params[a] ,您的代码就会起作用。

JQuery.extend()

假设extraParams是一个有效的数组/对象,您编写的代码一旦params不再破坏您的代码,然而: 请注意,这会修改您的extraParams对象。如果您希望新对象同时包含paramsextraParams会更像

var args = $.extend({}, params, extraParams)

这将修改一个空对象并添加paramsextraParams的内容。有关详细信息,请参阅the JQuery documentation

答案 1 :(得分:0)

一些操作和我能够达到所需的结果。 我发布了代码以供进一步参考:

var d = {};
jQuery.each($scope.linkParams, function(a,b) {
    a = "params[" + a + "]";
    d[a] = b;
});
jQuery.extend(extraParams, d);