1

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"}
]
1
  • 7
    I guess you can't have columnname twice as a property for one object as you expect in your result format. Commented Jan 10, 2020 at 12:29

2 Answers 2

2

You can use reduce method:

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:

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

Sign up to request clarification or add additional context in comments.

8 Comments

thanks @StepUp for your answer.. if i want add additional tag in column how to add that.. we will get another tag in column "datatype":"AlphaNumeric" its dynamically added . i need to have the values each column tags .. can i get in below format .. thanks for your help once again.. [{"tablename":"table name"},[{"columnname":"column1","datatype":"AlphaNumeric"},{"columnname":"couln2","datatype":null} ], {"tablename":"table name2"},[{"columnname":"tab_column1","datatype":"AlphaNumeric"},{"tab_columnname2":"couln2","datatype":null} ] ]
tried with updated code its only pushing column names, please let me know how can i achieve below format ... [ {"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 how is it possible to know what [ {"columnname":"column1", "datatype":"AlphaNumeric"}, {"columnname":"couln2", "datatype":null} ] has tableName?
below is the array i am having right now.. every column object will have table name in it .. [{"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"}]
thanks for the answer.. yes its working .. appreciate your help.
|
0

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.

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!

1 Comment

thanks for your answer and help. how can i change it to below format .. [{"tablename":"table name"},[{"columnname":"column1","datatype":"AlphaNumeric"},{"columnname":"couln2","datatype":null} ], {"tablename":"table name2"},[{"columnname":"tab_column1","datatype":"AlphaNumeric"},{"tab_columnname2":"couln2","datatype":null} ] ]

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.