Javascript 是否有任何方法可以基于键将对象附加到现有的对象数组中
我有一个json对象,如下所示Javascript 是否有任何方法可以基于键将对象附加到现有的对象数组中,javascript,json,Javascript,Json,我有一个json对象,如下所示 let existing_data = [ { "client":[ { "name":"aaaa", "filter":{ "name":"123456" } } ] }, {
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"
}
}
]
}
这将是动态的,因为现在刚刚给出了示例对象。如果我填写表单输入,将得到如下对象
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));
我不知道我是否理解。但是,正如您所说,您希望输入一个对象,它已经在原始数组中的对象中。
客户端名称
“aaaa”
已在现有的\u数据中。是这样吗?您可以使用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”}}}]
让输入数据={“客户机”:[{“名称”:“bbb”,“过滤器”:{“名称”:“2345”}]}
让输入_data2={“client2”:[{“name”:“bbb”,“filter”:{“name”:“2345”}]}
函数addData(旧数据、新数据){
let[key,value]=Object.entries(newData)[0]
设为假
让modifiedData=oldData.reduce((op,inp)=>{
if(输入hasOwnProperty(键)){
找到=真
op[key]=inp[key].concat(newData[key])
}否则{
op=对象分配(op,inp)
}
返回操作
}, {})
//返回值基于是否在数据中找到键
找到返回?modifiedData:Object.assign(modifiedData,newData)
}
日志(添加数据(现有数据、输入数据))
log(添加数据(现有数据,输入数据2))
这就是您需要的吗
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);
是否可以将现有数据设置为具有以下属性的对象:客户端、服务器、服务器2等?还是必须让它成为一个对象数组,每个对象只有一个属性?换句话说,它可以是这样的:让现有的_数据={“client”:[{“name”:“aaaa”,“filter”:{“name”:“123456”}],“server”:[…],“server_2”:[…],}为什么不直接使用现有的_数据[0]['client'])。push(input_数据['client'])
@GauravSingh这是一个输入,所以输入可以有不同的键。是的,请更正@code Maniacnot name“aaa”,需要检查“client”数组是否存在。如果存在,那么我需要使用现有的“客户机”数组追加该对象。否则需要添加新数组。我明白了吗?它正在向对象{“client”:[{“name”:“aaaa”,“filter”:{“name”:“123456”}},{“client”:[{“name”:“aaaa”,“filter”:{“name”:“123456”}}]}添加一个键。我需要一个“client”键,在里面附加新的数据这是有效的,但是,如果“input_data”不存在于“existing_data”中,那么我们应该添加该对象。请为该场景提供一些解决方案。再次抱歉,创建了JSFIDLE,请检查。它没有附加新值。我不知道我在哪里失踪。请参考,提供fiddle@Deepak,你在fiddle中有一个不同的结构,然后你发布了问题,这里你有一个键,所以我相应地合并了,在单个对象下有两个键,所以它只是合并了输入数据中的键,留下了其他键数据,是的,正确,实际上,fiddle的格式是正确的。真的很抱歉丢失了格式。你能给出一些解决办法吗?尝试了2天多。实际上,为什么格式不匹配意味着,这是动态对象,无论我从“addData”得到什么响应,函数我都会用另一个“新输入数据”将相同的内容再次传递到函数中。因此,请提供一些好的解决方案来克服这个问题