Array of Arrays к списку словарей

Я передаю это в функцию Data(массив):

[
[
    ['firstName', 'Joe'], ['lastName', 'low']
  ],
[
    ['firstName', 'Steph'], ['lastName', 'Roberts']
]
]

хотел бы вывести:

[
{firstName: 'Joe', lastName: 'low'},
{firstName: 'Steph', lastName: 'Roberts'}
]

Вот что у меня есть:

function Data(array) {
var dict ={};
for(var j =0; j<=array.length-1; j++){
  for(var i=0; i<=array[0].length-1; i++){
    dict[array[j][i][0]] = array[j][i][1];
  }
}
return dict
}

Но вывод не правильный:

{ firstName: 'Steph',
lastName: 'Roberts',
}

5 ответов

Вы обновляете один и тот же объект на каждой итерации, вместо этого вы должны создавать новый объект на каждой итерации и помещать его в массив

function Data(array) {
    var dict = [];
    for(var j =0; j<=array.length-1; j++) {
        dict[j] = {};
        for(var i=0; i<=array[0].length-1; i++) {
            dict[j][array[j][i][0]] = array[j][i][1];
        }
    }
    return dict;
}

console.log(Data([
    [
        ['firstName', 'Joe'], ['lastName', 'low']
    ],
    [
        ['firstName', 'Steph'], ['lastName', 'Roberts']
    ]
]));

Замена array[j] за array[0] в i<=array[0].length-1; установить массив как свойство dict объект

function Data(array) {
  var dict = {
    array: []
  };
  for (var j = 0; j <= array.length - 1; j++) {
    let o = {};
    for (var i = 0; i <= array[j].length - 1; i++) {
      o[[array[j][i][0]]] = array[j][i][1];
    }
    dict.array.push(o)
  }
  return dict
}

console.log(Data([
  [
    ['firstName', 'Joe'],
    ['lastName', 'low']
  ],
  [
    ['firstName', 'Steph'],
    ['lastName', 'Roberts']
  ]
]).array);

Ответ AvcS содержит причину сбоя вашего кода. Решение Nina идеально подходит, если вы можете использовать транспортер, такой как Babel, так как поддержка браузера для деструктурирования назначений выглядит довольно плохо.

В качестве альтернативы вы также можете использовать map и lower, что может упростить необходимый код:

let inp = [
  [['firstName', 'Joe'], ['lastName', 'low']],
  [['firstName', 'Steph'], ['lastName', 'Roberts']]
];

let result = inp.map(
  entry => entry.reduce(
    (obj, keyvalue) => {
      obj[keyvalue[0]] = keyvalue[1];
      return obj;
    }, {})
);

console.log(result);

Не забудьте добавить полифиллы для map а также replace и, возможно, заменить let S и функции стрелок.

Вы можете взять массив в качестве результата и взять один диктант для каждого внешнего элемента.

function getArrayOfObjects(array) {
    var result = [],
        dict,
        i, j;
      
    for (j = 0; j < array.length; j++) {
        dict = {};
        for (i = 0; i < array[0].length; i++) {
            dict[array[j][i][0]] = array[j][i][1];
        }
        result.push(dict);
    }
    return result;
}

var array = [[['firstName', 'Joe'], ['lastName', 'low']], [['firstName', 'Steph'], ['lastName', 'Roberts']]];

console.log(getArrayOfObjects(array));

ES6 с

function getArrayOfObjects(array) {
    return array.map(a => Object.assign(...a.map(([k, v]) => ({ [k]: v }))))
}

var array = [[['firstName', 'Joe'], ['lastName', 'low']], [['firstName', 'Steph'], ['lastName', 'Roberts']]];

console.log(getArrayOfObjects(array));

Вы должны объявить одну переменную массива для желаемого вывода вместо объекта. Object создаст ваш JSON, но вы хотите результаты в виде объекта JSON в форматах массива

function Data(array)  { 
 var res=[]; 
var dict ={}; 
 for(var j =0; j<=array.length-1; j++) 
{  
for(var i=0;i<=array[0].length-1; i++) 
{  
dict[array[j][i][0]] = array[j][i][1]; 
}
res.push(dict); 
 }  
return res;  
}
Другие вопросы по тегам