javascript - 在 javascript 循环中创建对象数组时出错
问题描述
我在创建对象数组时遇到问题。问题是您应该只创建 2 个对象,但最终创建了 8 个对象,因为属性的每个值都插入到一个新对象中。我有一个称为列的对象数组,它是动态的,因为值和属性正在变化
我需要的是根据行属性的值创建对象,例如只包含相同行值的对象。
example: [
{ string1: 'CONTRAPARTIDA',string2: 'NOMBRE',string3: null, number1: 'Orden', number2: 'VALOR ENV.' number3: null}, object with row value = 1
{ string1: 'CONTRAPARTIDA',string2: 'NOMBRE',string3: null, number1: 'Orden', number2: 'VALOR ENV.' number3: null}, //object with row value = 2
使用此代码,我尝试创建我的 2 个对象,但不幸的是,创建的对象比预期的要多。
for(let a in columnas){
//I can't do this validation because as the column array is dynamic I don't know how many rows come in //the array.
//if(columnas[a].fila ==1)
arrayFinal.push({
// validations to match the campoDb with the new array property and insert the value
string1: (columnas[a].campoDb==='STRING1' ? columnas[a].nombre : null),
string2:(columnas[a].campoDb==='STRING2' ? columnas[a].nombre : null),
string3: null,
number1: (columnas[a].campoDb==='NUMBER1' ? columnas[a].nombre : null),
number2:(columnas[a].campoDb==='NUMBER2' ? columnas[a].nombre : null),
number3: null,
});
但是作为图像中的附件,创建了 8 个对象,并且只填充了一个属性,正确的做法是只有 2 个具有这些值的对象。
Example: [
{ string1: 'CONTRAPARTIDA',string2: 'NOMBRE',string3: null, number1: 'Orden', number2: 'VALOR ENV.' number3: null},
{ string1: 'CONTRAPARTIDA',string2: 'NOMBRE',string3: null, number1: 'Orden', number2: 'VALOR ENV.' number3: null},
const columnas = [
{ nombre: 'ORDEN', fila: 1, campoDb: 'NUMBER1' },
{ nombre: 'CONTRAPARTIDA', fila: 1, campoDb: 'STRING1' },
{ nombre: 'NOMBRE', fila: 1, campoDb: 'STRING2' },
{ nombre: 'VALOR ENV.', fila: 1, campoDb: 'NUMBER2' },
{ nombre: 'ORDEN', fila: 2, campoDb: 'NUMBER1' },
{ nombre: 'CONTRAPARTIDA', fila: 2, campoDb: 'STRING1' },
{ nombre: 'NOMBRE', fila: 2, campoDb: 'STRING2' },
{ nombre: 'VALOR ENV.', fila: 2, campoDb: 'NUMBER2' },
];
let arrayFinal = [];
for(let a in columnas){
if(columnas[a].fila ==1) //no puedo hacer esta validacion xq como el arreglo columna es dinamico no se cuantas filas vengan en el areglo
arrayFinal.push({
string1: (columnas[a].campoDb==='STRING1' ? columnas[a].nombre : null),
string2:(columnas[a].campoDb==='STRING2' ? columnas[a].nombre : null),
string3: null,
number1: (columnas[a].campoDb==='NUMBER1' ? columnas[a].nombre : null),
number2:(columnas[a].campoDb==='NUMBER2' ? columnas[a].nombre : null),
number3: null,
});arrayFinal
}
console.log(arrayFinal);
我需要一些解决方案或建议,说明我可以做什么,或者我可以从我的代码中改变什么,以使我想做的事情更容易。
解决方案
const columnas = [
{ nombre: 'ORDEN', fila: 1, campoDb: 'NUMBER1' },
{ nombre: 'CONTRAPARTIDA', fila: 1, campoDb: 'STRING1' },
{ nombre: 'NOMBRE', fila: 1, campoDb: 'STRING2' },
{ nombre: 'VALOR ENV.', fila: 1, campoDb: 'NUMBER2' },
{ nombre: 'ORDEN', fila: 2, campoDb: 'NUMBER1' },
{ nombre: 'CONTRAPARTIDA', fila: 2, campoDb: 'STRING1' },
{ nombre: 'NOMBRE', fila: 2, campoDb: 'STRING2' },
{ nombre: 'VALOR ENV.', fila: 2, campoDb: 'NUMBER2' },
];
// 1. split the columns into two groups based on 'fila'
const rows = [1, 2].map((n) => columnas.filter(row => row.fila === n) )
// 2. iterate through each group
const results = rows.map(row => {
// these are the values of 'campoDb' we are looking for
return [ "STRING1", "STRING2", "STRING3", "NUMBER1", "NUMBER2", "NUMBER3" ]
.reduce((acc, campoDb) => {
// 2a. try to find an object that contains "campoDb"
const item = row.find(_ => _.campoDb === campoDb)
// 2.b if found, use that object's 'nombre', else use null
acc[campoDb.toLowerCase()] = item ? item.nombre : null
return acc
}, {})
})
console.log(results)
推荐阅读
- r - 如果在 R 中相似(两列),则将一个数据(三列)中的一列添加到另一个数据集(两列)
- javascript - 我是否在下面的 javascript 代码中正确实现了二进制搜索的概念
- angularjs - 使用Express从angularJS应用程序向nodeJS服务器发出带有参数和一些数据的put请求
- python - 使用 Python 下载许多图像的最佳策略?
- amazon-web-services - AWS Amplify 克隆存储库错误:“SSR 应用程序不支持基本身份验证。”
- twilio - Twilio 任务路由器 - 如何将分配的任务转移给其他工作人员?
- typescript - 类型“typeof videojs”上不存在属性“扩展”
- logging - Grafana:如何区分提醒和警报
- node.js - 根域上的前端(Apache)子域上的后端(节点)-> Websocket 连接失败
- python - Python:保留德语特殊字符并解码\x84的字符串编码