【问题标题】:Array formatting of JSON objects with key values具有键值的 JSON 对象的数组格式
【发布时间】:2020-04-28 02:30:52
【问题描述】:

我有一个格式如下的数组,我正在尝试删除重复的键并将其合并为一个。请告诉我如何实现这一目标。

[
  {"tablename":"table1","tablecolumns":"yes"},
  {"tablename":"table1","columnname":"column1"},
  {"tablename":"table1","columnname":"col2"},
  {"tablename":"table2","tablecolumns":"yes"},
  {"tablename":"table2","columnname":"column3"},
  {"tablename":"table2","columnname":"col4"}
]

预期格式:

[
    {"tablename":"table1","tablecolumns":"yes","columnname":"column1","columnname":"col2"},
    {"tablename":"table2","tablecolumns":"yes","columnname":"column3","columnname":"col4"}
]

【问题讨论】:

  • 我猜你不能将columnname 两次作为一个对象的属性,正如你在结果格式中所期望的那样。

标签: javascript arrays arraylist


【解决方案1】:

所以我在下面的评论中提到了您的问题,您不能像您期望的那样为对象使用相同的属性名称 - columnname

我建议使用不同的结构并将列名存储在数组中。

如下:

const data = [
    {"tablename":"table1","tablecolumns":"yes"},
    {"tablename":"table1","columnname":"column1"},
    {"tablename":"table1","columnname":"col2"},
    {"tablename":"table2","tablecolumns":"yes"},
    {"tablename":"table2","columnname":"column3"},
    {"tablename":"table2","columnname":"col4"}
];

const result = data.reduce((a,c) => {
  const foundelem = a.find(e => e.tablename === c.tablename);
  
  if (foundelem) {
    foundelem.columnnames.push(c.columnname);
  } else {
    a.push({
      tablename: c.tablename,
      tablecolumns: c.tablecolumns,
      columnnames: []
    });
  }
  
  return a;
}, []);

console.log(result);

希望对你有帮助!

【讨论】:

  • 感谢您的回答和帮助。我如何将其更改为以下格式.. [{"tablename":"table name"},[{"columnname":"column1","datatype":"AlphaNumeric"},{"columnname":"couln2", "datatype":null} ], {"tablename":"table name2"},[{"columnname":"tab_column1","datatype":"AlphaNumeric"},{"tab_columnname2":"couln2","datatype" :null} ] ]
【解决方案2】:

你可以使用reduce方法:

const result = arr.reduce((a, {tablename, tablecolumns, columnname}) => {
  a[tablename] = a[tablename] || {tablename, tablecolumns, columnnames: []};
  if (columnname)
    a[tablename].columnnames.push(columnname);
  return a;
},{})

一个例子:

let arr = [
  { "tablename": "table1", "tablecolumns": "yes" },
  { "tablename": "table1", "columnname": "column1" },
  { "tablename": "table1", "columnname": "col2" },
  { "tablename": "table2", "tablecolumns": "yes" },
  { "tablename": "table2", "columnname": "column3" },
  { "tablename": "table2", "columnname": "col4" }
];


const result = arr.reduce((a, {tablename, tablecolumns, columnname}) => {
  a[tablename] = a[tablename] || {tablename, tablecolumns, columnnames: []};
  if (columnname)
    a[tablename].columnnames.push(columnname);
  return a;
},{})

console.log(Object.values(result));

更新:

如果你有一个额外的标签datatype,那么你可以使用下面的代码sn -p:

let arr = [
    {"tablename":"table1","tablecolumns":"yes"},
    {"tablename":"table1","columnname":"col1","datatype":"Alphabetic"},
    {"tablename":"table2","tablecolumns":"yes"},
    {"tablename":"table2","columnname":"tabl2_colu","datatype":null},
    {"tablename":"table2","columnname":"tab2_col2","datatype":"Numeric"}
];

const result = arr.reduce((a, {tablename, tablecolumns, columnname, datatype}) => {
    a[tablename] = a[tablename] || {tablename, tablecolumns, columns: []};
    if (columnname)
      a[tablename].columns.push({columnname, datatype});
    return a;
  },{})
console.log(Object.values(result));

【讨论】:

  • 感谢@StepUp 的回答。如果我想在列中添加其他标签,如何添加它。我们将在“数据类型”列中获得另一个标签:“AlphaNumeric”它是动态添加的。我需要每个列标签的值..我可以得到以下格式..再次感谢您的帮助.. [{“tablename”:“table name”},[{“columnname”:“column1”,数据类型":"AlphaNumeric"},{"columnname":"couln2","datatype":null} ], {"tablename":"table name2"},[{"columnname":"tab_column1","datatype": "AlphaNumeric"},{"tab_columnname2":"couln2","datatype":null} ] ]
  • 用更新的代码尝试了它唯一推送的列名,请告诉我如何实现以下格式... [ {"tablename":"table name"},[{"columnname":" column1","datatype":"AlphaNumeric"},{"columnname":"couln2","datatype":null} ], {"tablename":"table name2"},[{"columnname":"tab_column1", "datatype":"AlphaNumeric"},{"tab_columnname2":"couln2","datatype":null} ]]
  • @user2319726 怎么可能知道[ {"columnname":"column1", "datatype":"AlphaNumeric"}, {"columnname":"couln2", "datatype":null} ] 有什么tableName
  • 下面是我现在拥有的数组..每个列对象中都会有表名.. [{"tablename":"table1","tablecolumns":"yes"},{ "tablename":"table1","columnname":"col1","datatype":"Alphabetic"},{"tablename":"table2","tablecolumns":"yes"},{"tablename":"table2 ","columnname":"tabl2_colu","datatype":null},{"tablename":"table2","columnname":"tab2_col2","datatype":"Numeric"}]
  • 感谢您的回答.. 是的,它的工作原理.. 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 2016-09-10
  • 2021-03-05
相关资源
最近更新 更多