Is there any way to append object into the existing array of objects based on the key

Viewed 59

I am having one json object like below,

let existing_data = [
       {
          "client":[
             {
                "name":"aaaa",
                "filter":{
                   "name":"123456"
                }
             }
          ]
       },
       {
          "server":[
             {
                "name":"qqqqq",
                "filter":{
                   "name":"984567"
                }
             }
          ]
       },
       {
          "server_2":[
             {
                "name":"Testing_2",
                "filter":{
                   "name":"567845"
                }
             }
          ]
       }
    ]

This will be dynamic, as of now just gave sample object. If i fill form inputs, will get a object like below,

let input_data =  {
      "client":[
         {
            "name":"aaaa",
            "filter":{
               "name":"123456"
            }
         }
      ]
    }

I need to append this object into the existing "client" json object. Expected output will be like,

[
   {
      "client":[
         {
            "name":"aaaa",
            "filter":{
               "name":"123456"
            }
         },
         {
            "name":"bbbb",
            "filter":{
               "name":"456789"
            }
         }
      ]
   },
   {
      "server":[
         {
            "name":"qqqqq",
            "filter":{
               "name":"984567"
            }
         }
      ]
   },
   {
      "server_2":[
         {
            "name":"Testing_2",
            "filter":{
               "name":"567845"
            }
         }
      ]
   }
]

I tried the below method, but it is not working as expected. Some help would be appreciated.

Tried like below and not worked as expected,

existing_data.forEach(function (obj) {
  if(Object.keys(obj) == 'client') {
    let old_values = Object.values(obj['client']);
    let new_values = {old_values,input_data['client']};
   }
});
    console.log(JSON.stringify(new_values));
3 Answers

I don't know if I'm understanding. But, as you say, you want to enter an object, which is already among the objects in the original array. The client name "aaaa" was already in existing_data json. Is that so?

You can use reduce and Object.entries and concat to merge new data with key's respective value

let existing_data = [{"client": [{"name": "aaaa","filter": {"name":"123456"}}]},{"server": [{"name": "qqqqq","filter": {"name":"984567"}}]},{"server_2": [{"name": "Testing_2","filter": {"name": "567845"}}]}]
let input_data = {"client": [{"name": "bbb","filter": {"name": "2345"}}]}
let input_data2 = {"client2": [{"name": "bbb","filter": {"name": "2345"}}]}

function addData(oldData, newData) {
  let [key, value] = Object.entries(newData)[0]
  let found = false
  let modifiedData = oldData.reduce((op, inp) => {
    if (inp.hasOwnProperty(key)) {
      found = true
      op[key] = inp[key].concat(newData[key])
    } else {
      op = Object.assign(op, inp)
    }
    return op
  }, {})
  
  // return value based on key found in data or not
  return found ? modifiedData : Object.assign(modifiedData, newData)
}

console.log(addData(existing_data, input_data))
console.log(addData(existing_data, input_data2))

is this what you need?

let existing_data = [{
    "client": [{
      "name": "aaaa",
      "filter": {
        "name": "123456"
      }
    }]
  },
  {
    "server": [{
      "name": "qqqqq",
      "filter": {
        "name": "984567"
      }
    }]
  },
  {
    "server_2": [{
      "name": "Testing_2",
      "filter": {
        "name": "567845"
      }
    }]
  }
];

existing_data.find(function(obj) {
    return "client" in obj;
}).client.push(new_values);

console.log(existing_data);
Related