首页 > 解决方案 > 如何使用构造函数创建对象数组?

问题描述

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:[]初始对象数组中的每个对象创建 。

标签: javascriptjsonalgorithm

解决方案


您正在寻找这样的东西吗?

每个输入对象都映射到具有属性的输出对象,该属性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.entriesand完成的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);


推荐阅读