javascript - 如何在列表中附加字典?
问题描述
我正在尝试创建一个将值存储在字典中的 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 ] }
]
我究竟做错了什么?
解决方案
您的代码的问题在于您“填充”的位置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));
推荐阅读
- python - 为什么调整图像大小最终也会改变通道?
- azure - 适用于小型公司的 Azure AD + 安全性
- python - 在 Flask 中获取仅返回模板/html 页面的路由
- amazon-web-services - 多次点击 API 资源时出现 Aws Api 网关 cors 问题
- python - 如何使用 KERAS 获取 DNN 最后一层的值?
- javascript - 如何添加一个会等到 firebase auth 加载的 firebase 侦听器?
- swift - 如何在 Swift 中不硬编码用户集合文档 ID 的情况下将数据添加到 Firestore Cloud
- excel - 对象变量问题或块变量未设置错误涉及添加新工作表和范围
- sql - JOIN 删除没有条目的行
- python - 如何在另一个文件中的文件中搜索字符串