javascript - 如何使用构造函数创建对象数组?
问题描述
a)我有一个看起来像这样的对象数组:
[
{
"Account": "1111-000",
"Desc": "Accrued - Payroll & Payroll Tax",
"Amount": "-8,459.88",
"Partner": "RAP",
"FY": "2018",
"PD": "10",
"VNO": "abc"
},
{
"Account": "2222-000",
"Desc": "Accrued - Management Fee",
"Amount": "-9,228.33",
"Partner": "RAP",
"FY": "2018",
"PD": "10",
"VNO": "dfe"
},
{
"Account": "3333-000",
"Desc": "Current Year Earnings",
"Amount": "0",
"Partner": "RAP",
"FY": "2018",
"PD": "10",
"VNO": "bcd"
},
]
b)我想遍历每个对象并使用构造函数创建如下输出:
gridinsert: [{
value: "1111-000",
command: "setGridValue",
columnID: "17"
}, {
value: "Accrued-Payroll & payroll tax",
command: "setGridValue",
columnID: "18"
}, {
value: "-8,459.88",
command: "setGridValue",
columnID: "19"
}, {
value: "RAP",
command: "setGridValue",
columnID: "20"
}, {
value: "2018",
command: "setGridValue",
columnID: "12"
}, {
value: "10",
command: "setGridValue",
columnID: "21"
}, {
value: "abc",
command: "setGridValue",
columnID: "23"
}]
JSON 将始终按所示顺序排列。所以在输出中,我基本上必须提取值并为每个值创建一个对象。我需要为gridinsert:[]
初始对象数组中的每个对象创建 。
解决方案
您正在寻找这样的东西吗?
每个输入对象都映射到具有属性的输出对象,该属性gridinsert
是从输入对象中的每个属性构建的对象数组。
列 ID 使用对象映射到属性名称:
const colIDs = {
Account: 17,
Desc: 18,
Amount: 19,
Partner: 20,
FY: 12,
PD: 21,
VNO: 23
};
如果键不一致,例如,如果您混合了大写或小写键并且某些键中可能存在错误,请将所有键转为小写并添加常见错误或同义词键的条目。在通过键访问地图之前,请确保将键小写。
const colIDs = {
account: 17,
desc: 18,
description: 18, // this could be used instead of desc
amount: 19,
quantity: 19, // and this instead of amount
partner: 20,
fy: 12,
pd: 21,
vno: 23
};
映射是使用Object.entries
and完成的map
:
const result = data.map(elem => ({
gridinsert: Object.entries(elem).map(([key, value]) => ({
value,
command: 'setGridValue',
columnID: colIDs[key.toLocaleLowerCase()]
}))
}));
这是一个例子:
const data = [{
"account": "1111-000", // lowercase
"Desc": "Accrued - Payroll & Payroll Tax",
"amount": "-8,459.88", //lowercase
"Partner": "RAP",
"FY": "2018",
"PD": "10",
"VNO": "abc"
}, {
"Account": "2222-000",
"Description": "Accrued - Management Fee", // synonym key
"Amount": "-9,228.33",
"Partner": "RAP",
"FY": "2018",
"PD": "10",
"VNO": "dfe"
}, {
"Account": "3333-000",
"Desc": "Current Year Earnings",
"Amount": "0",
"Partner": "RAP",
"FY": "2018",
"PD": "10",
"VNO": "bcd"
}];
const colIDs = {
account: 17,
desc: 18,
description: 18,
amount: 19,
quantity: 19,
partner: 20,
fy: 12,
pd: 21,
vno: 23
};
const result = data.map(elem =>
Object.entries(elem).map(([key, value]) => ({
value,
command: 'setGridValue',
columnID: colIDs[key.toLocaleLowerCase()]
})
));
console.log(result);
相反,如果您希望将输入项的所有转换后的属性放在一个数组中,则可以这样做:
const result = data.reduce((acc, elem) => {
const entries = Object.entries(elem).map(([key, value]) => ({
value,
command: 'setGridValue',
columnID: colIDs[key.toLocaleLowerCase()]
}));
acc = [...acc, ...entries];
return acc;
}, []);
但是,这样做会导致具有相同值的属性之间发生冲突。
const data = [{
"account": "1111-000", // lowercase
"Desc": "Accrued - Payroll & Payroll Tax",
"amount": "-8,459.88", //lowercase
"Partner": "RAP",
"FY": "2018",
"PD": "10",
"VNO": "abc"
}, {
"Account": "2222-000",
"Description": "Accrued - Management Fee", // synonym key
"Amount": "-9,228.33",
"Partner": "RAP",
"FY": "2018",
"PD": "10",
"VNO": "dfe"
}, {
"Account": "3333-000",
"Desc": "Current Year Earnings",
"Amount": "0",
"Partner": "RAP",
"FY": "2018",
"PD": "10",
"VNO": "bcd"
}];
const colIDs = {
account: 17,
desc: 18,
description: 18,
amount: 19,
quantity: 19,
partner: 20,
fy: 12,
pd: 21,
vno: 23
};
const result = data.reduce((acc, elem) => {
const entries = Object.entries(elem).map(([key, value]) => ({
value,
command: 'setGridValue',
columnID: colIDs[key.toLocaleLowerCase()]
}));
acc = [...acc, ...entries];
return acc;
}, []);
console.log(result);
推荐阅读
- cookies - 本地存储(在浏览器中)的 cookie 可以查看我的浏览历史记录吗?
- javascript - 悬停时底部显示三角形之后/之前的图像
- c# - 使用 .NET Core 在 Visual Studio Code 中进行调试时如何捕获输入
- javascript - Adding Buttons dynamically HTML
- hadoop - 使用 copyToLocal 从 HDFS 复制的路径
- python - Pyodbc - 读取存储过程的输出参数(SQL Server)
- python - 阿拉伯语的 Python 和名称实体识别
- f# - 将同步函数转换为异步得到“此构造只能在计算表达式中使用”?
- html - Bootstrap - Img 中的徽章响应式
- angular - 如果起始范围不为零,则 HTTP 范围请求不起作用