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

时间:2017-11-19 02:19:22

标签: 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
}

1 个答案:

答案 0 :(得分:2)

在外部阵列上使用.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("----------");
}