I have this object with tables:
let tables = { "2021-08-25": { "B0705": { "48": "heaven" }, "B0704": { "48": "hell" } } }
An I would like to insert dynamicly a new table. I tried this:
var insertTable = (date,table,slot) => { let newDesk = { [date]: { [table]: { [slot]: 'slotter' } } }; Object.assign(tables,newDesk); };
But it overwrites my exsiting entrances.
This will also not work:
var insertTable2 = (date,table,slot) => { Object.defineProperty(tables, date, { table: {slot: 'slotter'} }); };
How this will work?
insertTable2("2021-08-25","B0705","22"); insertTable2("2021-08-25","B0705","12"); insertTable2("2021-08-25","B0706","33"); insertTable2("2021-08-26","B0703","11");
Advertisement
Answer
For a more reusable solution, take a look at this SO question – you want to deep merge the new object with the old one, not shallowly merge them.
A non reusable solution can be built like this (to illustrate that for more complex paths/requirements the above solution is much easier):
let tables = { "2021-08-25": { "B0705": { "48": "heaven" }, "B0704": { "48": "hell" } } } // this will mutate the tables object const insertTable = (date, table, slot) => { // is there an object with this date yet? if not create it. if(typeof tables[date] === "undefined"){ tables[date] = {}; } // is there an object with this table yet? if not create it. if(typeof tables[date][table] === "undefined"){ tables[date][table] = {}; } // set the value now that we know all intermediate objects are defined. tables[date][table][slot] = "slotter"; } console.log(tables); insertTable("2021-08-25","B0705","22"); insertTable("2021-08-25","B0705","12"); insertTable("2021-08-25","B0706","33"); insertTable("2021-08-26","B0703","11"); console.log(tables);