有没有办法通过比较键值对来动态修改对象

时间:2020-04-02 05:38:34

标签: javascript json

我正在使用以下格式的动态JSON数组,

let main_object = [
   {
      "apple":[
         {
            "name":"aaaa",
            "count":"1",
            "filter":{
               "type":{
                  "name":"test3"
               }
            }
         },
         {
            "name":"bbbb",
            "count":"9",
            "filter":{
               "type":{
                  "name":"test2"
               }
            }
         }
      ]
   },
   {
      "orange":[
         {
            "name":"cccc",
            "count":"6",
            "filter":{
               "type":{
                  "name":"test"
               }
            }
         }
      ]
   }
]

此处的键“名称”是唯一的。更新表单时,我将得到如下的json数组,

let updated_data = {
       "orange":[
          {
             "name":"cccc",
             "count":"1234",
             "type":{
                "name":"updated_name"
             }
          }
       ]
    }

我需要检查“ main_object”中json数组中的“名称”,并删除现有的名称,并使用新的“ updated_data”更新到“ main_object”中。

预期输出

let main_object = [
   {
      "client":[
         {
            "name":"aaaa",
            "count":"1",
            "filter":{
               "type":{
                  "name":"test3"
               }
            }
         },
         {
            "name":"bbbb",
            "count":"9",
            "filter":{
               "type":{
                  "name":"test2"
               }
            }
         }
      ]
   },
   {
      "orange":[
         {
            "name":"cccc",
            "count":"1234",
            "filter":{
               "type":{
                  "name":"updated_name"
               }
            }
         }
      ]
   }
]

我尝试使用以下方法,但未定义其抛出图。不知道我在想什么。有什么办法可以做到这一点。任何帮助将非常感激。提前致谢。 这是小提琴-https://jsfiddle.net/ynx6oqrp/

let rtype = 'orange';

const altered = 
  main_object.map((level1,i) => {
   const data = main_object[0].rtype.map((item,index) => {
      if(item.name === updated_data[0].rtype[0].name){
          item = updated_data[0].rtype[0];
       }
       return item;
      })
    if(level1.rtype){
      level1.rtype = data;
    }
    return level1;
  })

console.log(altered);

1 个答案:

答案 0 :(得分:1)

Map方法仅用于数组,因此您需要像level1[rtype]那样制作地图,

level1[rtype].map()

然后比较名称使用情况,

if(item.name === updated_data[rtype][0].name) {
       item = updated_data[rtype];
}

以及如下工作片段,

let main_object = [
       {
          "apple":[
             {
                "name":"aaaa",
                "count":"1",
                "filter":{
                   "type":{
                      "name":"test3"
                   }
                }
             },
             {
                "name":"bbbb",
                "count":"9",
                "filter":{
                   "type":{
                      "name":"test2"
                   }
                }
             }
          ]
       },
       {
          "orange":[
             {
                "name":"cccc",
                "count":"6",
                "filter":{
                   "type":{
                      "name":"test"
                   }
                }
             }
          ]
       }
    ]
    
    
    
    let updated_data = {
	   "orange":[
	      {
	         "name":"cccc",
	         "count":"1234",
	         "type":{
	            "name":"updated_name"
	         }
	      }
	   ]
	}

let rtype = 'orange';

const altered = 
  main_object.map((level1,i) => {

  if(level1[rtype] !== undefined){
     const data = level1[rtype].map((item,index) => {
     if(item.name === updated_data[rtype][0].name) {
       item = updated_data[rtype];
     }
     return item;
  })
      if(level1[rtype] !== undefined){
      level1[rtype] = data;
    }
  }
    return level1; 
  })

console.log(altered);

Forked JsFiddle here ...