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 с
Object.assign
для сбора частей объекта,синтаксис распространения
...
для принятия массива в качестве параметровArray#map
для получения нового массива,деструктурирующее назначение для получения значений объекта вместо использования массива, и
Имена вычисляемых свойств для использования переменной в качестве ключа.
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;
}