首页 > 解决方案 > 具有键值的 JSON 对象的数组格式

问题描述

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

[
  {"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"}
]

标签: javascriptarraysarraylist

解决方案


您可以使用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,那么你可以使用下面的代码片段:

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));


推荐阅读