有什么办法可以根据键将对象追加到现有的对象数组中

时间:2020-03-30 03:30:55

标签: javascript json

我有一个如下的json对象,

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":"aaaa",
            "filter":{
               "name":"123456"
            }
         }
      ]
    }

我需要将此对象附加到现有的“客户端” json对象中。预期的输出将是这样,

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

我尝试了以下方法,但无法正常工作。一些帮助,将不胜感激。

尝试如下,未按预期工作

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 个答案:

答案 0 :(得分:0)

我不知道我是否理解。但是,正如您所说,您想输入一个对象,该对象已经在原始数组的对象之中。 客户端名称"aaaa"已在existing_data json中。是这样吗?

答案 1 :(得分:0)

您可以使用 reduce Object.entries concat 合并具有键值的新数据

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

答案 2 :(得分:0)

这是您需要的吗?

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