Как добавить словари в список? - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь создать цикл for, который хранит значения в словаре, и каждая итерация добавляет этот словарь в список.

Уже пытался присоединиться, используя push () и индексный список, но безуспешно.

json = {
    "MUNICIPIOS":[
        {"ATRIBUTOS":["atrib1","atrib2","atrib3"],"VALORES": [10, 100, 1000]},
        {"ATRIBUTOS":["atrib1","atrib2","atrib3"],"VALORES": [20, 200, 2000]},
        {"ATRIBUTOS":["atrib1","atrib2","atrib3"],"VALORES": [30, 300, 3000]},
        {"ATRIBUTOS":["atrib1","atrib2","atrib3"],"VALORES": [40, 400, 4000]}
    ]
};

var atributos = json["MUNICIPIOS"][0]["ATRIBUTOS"];
var municipios = json["MUNICIPIOS"];
var dimensoes = [];
var dicionario = {label:"", values:[]};


for (var atr = 0; atr < atributos.length; atr++){

    dicionario.label = atributos[atr];

    valores = [];
    for (var mun=0; mun < municipios.length; mun++){
        valores.push(municipios[mun]["VALORES"][atr]);
        dicionario.values = valores;
    }

    //dimensoes.push(dicionario);
    dimensoes[atr] = dicionario;
}

console.log(dimensoes);

Результат не такой, как я хотел:

// Actual result
[
  { label: 'atrib3', values: [ 1000, 2000, 3000, 4000 ] },
  { label: 'atrib3', values: [ 1000, 2000, 3000, 4000 ] },
  { label: 'atrib3', values: [ 1000, 2000, 3000, 4000 ] }
]

Мне нужно это:

// Expected result
[
  { label: 'atrib1', values: [ 10, 20, 30, 40 ] },
  { label: 'atrib2', values: [ 100, 200, 300, 400 ] },
  { label: 'atrib3', values: [ 1000, 2000, 3000, 4000 ] }
]

Что я делаю не так?

1 Ответ

2 голосов
/ 29 сентября 2019

Проблема с вашим кодом заключается в том, что вы «заполняете» dicionario - этот один объект используется и изменяется для всех выходных данных dimensoes[atr]

var dicionario = {label:"", values:[]};

for (var atr = 0; atr < atributos.length; atr++){

    dicionario.label = atributos[atr];
    // snip - rest of your code
    dimensoes[atr] = dicionario;
}

Одним из решений является изменение кода таким образом, чтобы каждыйВ итерации появился новый объект dicionario для работы с

var dicionario = {label:"", values:[]};

for (var atr = 0; atr < atributos.length; atr++){

    dicionario = {label:atributos[atr], values:[]};

    //dicionario.label = atributos[atr]; not required as it is set above
    // snip - rest of your code

    dimensoes[atr] = dicionario;
}

Однако для аккуратного и опрятного решения ES6 +:

const json = {
    "MUNICIPIOS":[
        {"ATRIBUTOS":["atrib1","atrib2","atrib3"],"VALORES": [10, 100, 1000]},
        {"ATRIBUTOS":["atrib1","atrib2","atrib3"],"VALORES": [20, 200, 2000]},
        {"ATRIBUTOS":["atrib1","atrib2","atrib3"],"VALORES": [30, 300, 3000]},
        {"ATRIBUTOS":["atrib1","atrib2","atrib3"],"VALORES": [40, 400, 4000]}
    ]
};

const atributos = json.MUNICIPIOS[0].ATRIBUTOS;
const municipios = json.MUNICIPIOS;
const dimensoes = atributos.map((label, atr) => ({
  label,
  values: municipios.map(municipio => municipio.VALORES[atr])
}));
console.log(JSON.stringify(dimensoes, null, 4));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...