[英]Array formatting of JSON objects with key values
I have an array with below format, I am trying to remove duplicate keys and merge it to one.我有一个以下格式的数组,我正在尝试删除重复的键并将其合并为一个。 Please let me know how to achieve this.
请让我知道如何实现这一目标。
[
{"tablename":"table1","tablecolumns":"yes"},
{"tablename":"table1","columnname":"column1"},
{"tablename":"table1","columnname":"col2"},
{"tablename":"table2","tablecolumns":"yes"},
{"tablename":"table2","columnname":"column3"},
{"tablename":"table2","columnname":"col4"}
]
expected format:预期格式:
[
{"tablename":"table1","tablecolumns":"yes","columnname":"column1","columnname":"col2"},
{"tablename":"table2","tablecolumns":"yes","columnname":"column3","columnname":"col4"}
]
You can use reduce
method:您可以使用
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;
},{})
An example:一个例子:
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));
UPDATE:更新:
If you have an additional tag datatype
, then you can use the following code snippet:如果您有一个额外的标签
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));
So I have mentioned in my comment below your question you can't have the same property name for an object as you expect - columnname
.因此,我在您的问题下方的评论中提到,对象的属性名称不能与您期望的相同 -
columnname
。
Instead I suggest to have a different structure and store the column names in an array.相反,我建议使用不同的结构并将列名存储在数组中。
Like the following:像下面这样:
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);
I hope that helps!我希望这有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.