Javascript 使用键值设置JSON对象的数组格式

Javascript 使用键值设置JSON对象的数组格式,javascript,arrays,arraylist,Javascript,Arrays,Arraylist,我有一个以下格式的数组,我正在尝试删除重复的键并将其合并为一个。请让我知道如何做到这一点 [ {"tablename":"table1","tablecolumns":"yes"}, {"tablename":"table1","columnname":"column1"}, {"tablename":"table1","columnname":"col2"}, {"tablename":"table2","tablecolumns":"yes"}, {"tablename"

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

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

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

例如:

const数据=[
{“tablename”:“table1”,“tablecolumns”:“yes”},
{“tablename”:“table1”,“columnname”:“column1”},
{“tablename”:“table1”,“columnname”:“col2”},
{“tablename”:“table2”,“tablecolumns”:“yes”},
{“tablename”:“table2”,“columnname”:“column3”},
{“tablename”:“table2”,“columnname”:“col4”}
];
常量结果=数据减少((a,c)=>{
const foundelem=a.find(e=>e.tablename==c.tablename);
if(foundelem){
foundelem.columnnames.push(c.columnname);
}否则{
a、 推({
tablename:c.tablename,
tablecolumns:c.tablecolumns,
列名称:[]
});
}
返回a;
}, []);

控制台日志(结果)您可以使用
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;
},{})
例如:

让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:[]};
如果(列名称)
a[tablename].columnnames.push(columnname);
返回a;
},{})

console.log(Object.values(result))
我想在结果格式中,一个对象的
columnname
属性不能是预期的两倍。谢谢@Steppup的回答。。如果我想在列中添加额外的标记,如何添加。。我们将在“数据类型”列中得到另一个标记:“字母数字”是动态添加的。我需要有每个列标记的值。。我可以用下面的格式吗。。再次感谢你的帮助。。[{“tablename”:“table name”}、[{“columnname”:“column1”,“datatype”:“字母数字”}、{“columnname”:“couln2”,“datatype”:null}]、{“tablename”:“table name2”}、[{“columnname”:“tab_column1”,“datatype”:“字母数字”}、{“tab_columnname2”:“couln2”,“datatype”:null}]]尝试用更新的代码推送列名,请让我知道如何才能实现以下格式。。。[{“tablename”:“tablename”}、[{“columnname”:“column1”、“数据类型”:“字母数字”}、{“columnname”:“couln2”、“数据类型”:null}]、{“tablename”:“table name2”}、[{“columnname”:“tab_column1”、“数据类型”:“字母数字”}、{“tab_columnname2”、“数据类型”:null}]@user2319726如何知道
[{“columnname”:“column1“字母数字”},{“columnname”:“couln2”,“datatype”:null}]
tableName
?下面是我现在拥有的数组..每个列对象中都有表名..[{“tableName”:“table1”,“tablecolumns”:“yes”},{“tableName”:“table1”,“columnname”:“字母”},{“tableName”:“table2”,“tablecolumns”:“yes”},{”tablename:“table2”,“columnname:“table2”;“columnname:“table2”;“columnname:“table2”;“columnname:“tab2”;“datatype:“Numeric”}]谢谢你的回答..是的,很有效..感谢你的帮助。谢谢你的回答和帮助。我如何将其更改为以下格式..[{“tablename:“table name”},[{“columnname:“column1”,“datatype:“字母数字”},{“columnname”:“couln2”,“数据类型”:null}],{“tablename”:“table name2”},[{“columnname”:“tab_column1”,“数据类型”:“字母数字”},{“tab_columnname2”:“couln2”,“数据类型”:null}]]