对象数组的数组数组JS

时间:2017-03-27 01:57:20

标签: javascript arrays

这个特殊的挑战要求我将一个数组数组(有一个术语吗?)转换为一个对象数组,如下所示:

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

成:

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

到目前为止,这是我的代码:

function transformEmployeeData(array) {
var object={};
for (var i = 0; i < array.length;i++){
    var newArray = array[i];
    object[i] = newArray[1];
    object[newArray[0]] = object[i];
    newArray.push(object);
    delete object[i];
    }
return object;
}

var myArray= [['firstName','Joe'],['lastName','Blow'],['age', 42], ['role','clerk']];
transformEmployeeData(myArray); 

它似乎工作得很好,直到我添加另一个嵌套数组与第二个(或第三个,或第四个,这是事物的全部点)员工的数据。

我确定它与循环有关,但我无法发现它。

帮助表示感谢!

3 个答案:

答案 0 :(得分:3)

你需要在循环中创建一个新对象,这样你每次都可以创建一个新对象而不只是重新分配同一个对象的属性 - 你正在推送同一个对象多次进入数组。 (我不确定你使用Bind<Context>().ToSelf() .WithConstructorArgument(CONNECTION_STRING, c => c.Kernel.Get<IUserDatabase>().ConnectionString) 的原因 - 你不需要它。)

这样的事情:

&#13;
&#13;
delete
&#13;
&#13;
&#13;

或者,如果您想使用某些数组函数,例如.map().reduce(),您可以&#34;简化&#34;代码:

&#13;
&#13;
function transformEmployeeData(data) {
  var result = []                              // new array to hold transformed data
  var key, value
  for (var i = 0; i < data.length; i++) {      // loop over employees
    var employee = {}                          // new object for current employee
    for (var j = 0; j < data[i].length; j++) { // loop over current employee details
      key = data[i][j][0]                      // extract property key name
      value = data[i][j][1]                    // and value
      employee[key] = value                    // add property to object
    }
    result.push(employee)                      // add new object to array
  }
  return result
}

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

console.log( transformEmployeeData(input) )
&#13;
&#13;
&#13;

答案 1 :(得分:3)

以下是使用Array.prototype.map()Array.prototype.reduce()的解决方案:

$ git ls-files foo/bar | cut -d/ -f-3 | uniq

答案 2 :(得分:1)

这是我使用forEach数组对象方法

的解决方案
    var array = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
    [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]];

    transformEmployeeData(array);

    function transformEmployeeData(array){
      var employees = [];
      array.forEach(function(employee,index){
        var employeeObj = {};
        employee.forEach(function(data,key){
          employeeObj[data[0]] = data[1];
        });
        employees.push(employeeObj);
      });
      return employees;
    }