【问题标题】:Possible to .push() to a dynamically named key?可以 .push() 到动态命名的键吗?
【发布时间】:2018-10-17 16:43:33
【问题描述】:

我有一个对象,我想使用循环将不确定数量的其他对象推送到该对象。为了保持井井有条,我想根据循环运行的次数动态命名键。我有以下内容:

let formsJson = {};
let counter = 1;

//savedForms are where the objects that I want to push reside
savedForms.forEach( form => {
  formsJson['form'+counter] = JSON.parse(form.firstDataBit_json);

  //This is where I'm having trouble

  counter = counter + 1;
});

我可以很好地推送数据的第一位,也可以动态命名密钥。但是我需要将另外 2 个对象推到同一个动态键上,这就是我遇到麻烦的地方。如果我尝试显而易见的做法:

formsJson['form'+counter].push(JSON.parse(form.secondDataBit_JSON));

我没有得到任何输出。有没有办法做到这一点?

【问题讨论】:

  • 从我在这里看到的情况来看,您的键只是对象内表单数量的增量计数。我认为在这里使用数组比使用关联数组更好。你能告诉我们你为什么选择使用关联数组吗?
  • Object.assign(formsJson['form'+counter], newObj) 假设新对象中的键不重叠.. 不太确定这里的实际最终目标是什么。其他答案建议改用数组,这只是另一种方法。
  • @CalvinEllis 我正在从 SQL(通过 express)中提取与用户 ID 匹配的所有数据行。用户可以在 SQL 表中保存不定数量的表单,每行(表单)由 3 列 JSON 数据组成。因此需要解析它们并将每个发送到一个动态密钥。希望这是有道理的:)
  • @rlemon 这很有趣,我会试一试

标签: javascript arrays loops dynamic foreach


【解决方案1】:

forEach() 已经让您可以访问索引。无需创建 counter 变量。 Example usage。我肯定会推荐使用简单的索引,而不是使用 'form'+counter 键。

在您的示例中,我不清楚在 forEach 循环中分配的值是一个数组。所以不清楚你是否可以push 到其中的任何给定元素。但通常该语法应该

就个人而言,我更希望有一个函数可以输出元素的整个值。这将提供更好的封装性、可测试性,并有助于强制执行默认值。比如:

function createItem(param1) { 
  let item = [];
  item.push(param1.someElement);
  if (foo) {
    item.push(...);
  } else {
    item.push(...);
  }
  return item;
}

formsJson['form'+counter] = createItem( JSON.parse(form) )

【讨论】:

  • 这是一个很好的解决方案,通过一些小的调整,它让我得到了我需要做的事情。我最终调整了我在原始问题上做一些事情的方式,因为它们不符合我的目的。然而,这回答了最初的问题。谢谢你让我走上正确的道路:)
【解决方案2】:

因此,您通过分配 JSON 解析而不是您想要的数组来制作 formsJson['form'+counter] a。试试这个:

formsJson['form'+counter] = [];
formsJson['form'+counter].push(JSON.parse(form.firstDataBit_json));
formsJson['form'+counter].push(JSON.parse(form.secondDataBit_JSON));

【讨论】:

  • 试过了,没有得到任何输出(我的问题的最后一行:)
【解决方案3】:

也许你想弄清楚这样的事情

savedforms.forEach((form, index)  => 
 formsJson[`form${index + 1}`] = [ JSON.parse(form.secondDataBit_JSON)]) 

现在你可以推送项目了

formsJson[`form${index + 1}`].push(JSON.parse(form.secondDataBit_JSON));`

在这里你将保存自动递增的操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多