javascript - 如何在同一个 for 循环中声明一个新对象而不覆盖之前的迭代?

标签 javascript arrays loops object iterator

所以我这个练习的问题是,在我将第一个嵌套数组转换为对象后,迭代将进入下一个嵌套数组并覆盖我刚刚转换的第一个嵌套数组。

所以我的问题之一是如何告诉我的代码停止迭代我刚刚转换为对象的内容并使用我需要转换的下一个嵌套数组创建一个新对象?

添加到我之前的问题中,根据练习,我需要放置新创建的对象并将它们存储在数组中。我计划首先创建对象,然后最后将它们插入占位符数组变量中。有没有更有效的方法可以在循环中实现此目的?

任何帮助将不胜感激,这里仍然有点新,所以不要太刻薄哈哈。

这是我到目前为止所做的+说明!

*编写一个名为“transformEmployeeData”的函数,将某些员工数据从一种格式转换为另一种格式。

论证将如下所示:

[
    [
        ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
    ],
    [
        ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']
    ]
]
Given that input, the return value should look like this:

[
    {firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk'},
    {firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager'}
]

请注意,输入可能具有与给定示例不同的行数或不同的键。

例如,假设人力资源部门向每个员工记录添加一个“tshirtSize”字段。 您的代码应该灵活地适应这一点。 *

    function transformEmployeeData(employeeData) {
  debugger;
  var obj = {};
  for (var i = 0; i < employeeData.length; i++) {
    for (var y = 0; y < employeeData[i].length; y++) {
      obj[employeeData[i][y][0]] = employeeData[i][y][1]
    }
  }
  return obj
}

最佳答案

在外部数组上使用 .map(),在内部数组上使用 .reduce()

var data = [
    [
        ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
    ],
    [
        ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']
    ]
];

var res = data.map(a => a.reduce((r, [k, v]) => ({[k]: v, ...r}), {}));

console.log(res);

<小时/>

或者像这样:

var data = [
    [
        ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
    ],
    [
        ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']
    ]
];

var res = data.map(a => Object.assign({}, ...a.map(([k, v]) => ({[k]: v}))));

console.log(res);

<小时/>

或者使用实际的Map而不是对象。然后你可以这样做:

var data = [
    [
        ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
    ],
    [
        ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']
    ]
];

var res = data.map(a => new Map(a));


for (const m of res) {
  for (const [k, v] of m) {
    console.log(k, v);
  }
  console.log("----------");
}

关于javascript - 如何在同一个 for 循环中声明一个新对象而不覆盖之前的迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47373116/

相关文章:

javascript - 在 .nest() 调用后使用 d3.js 将数据放入表中

javascript - 是否可以将标题居中对齐但将副标题左对齐到标题的左侧,最好不用 JavaScript?

javascript - P5js库中如何获取鼠标拖动对象的速度

javascript - 在 iMacros 中使用 EVAL 语句从 Javascript 数组中获取字符串

javascript - 如何循环这个函数?

c - 传递给函数时数组的大小

python - 如何用单个 numpy 数组操作替换这个三重 For 循环?

c++ - 破坏 std::stringbuf 导致访问冲突

java - 如何在 Java 中循环参数

Java:将 TRUE/FALSE 的所有可能组合添加到列表中