正在根据 id 更新 JSON 结构

Updating JSON structure based on id

我试图更新下面给定的 JSON 结构中的城镇名称。


    "City":[
   {
      "Name":"Delhi",
      "id":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bd",
      "Towns":[
         {
            "Name":"MG Colony",
            "conditionId":"60d1f5eb-0222-4a84-879b-6699b0cfc1a4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bd"
         },
         {
            "Name":"DLF Colony",
            "conditionId":"60d1f5eb-0222-4a84-879b-7749b0cfc1a4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bd"
         }
      ]
   },
   {
      "Name":"Pune",
      "id":"c5d58bef-f1c2-4b7c-a6d7-f64df12321ax",
      "Towns":[
         {
            "Name":"Hadapsar",
            "conditionId":"60d1f5eb-0222-4a84-879b-6699b0cfc1x4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321ax"
         },
         {
            "Name":"Magarpatta",
            "conditionId":"60d1f5eb-0222-4a84-879b-7749b0cfc1f4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bax"
         }
      ]
   }
]

如果我的 cid 匹配哈达普萨尔镇

我想要的输出是:


   "City":[
   {
      "Name":"Delhi",
      "id":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bd",
      "Towns":[
         {
            "Name":"MG Colony",
            "conditionId":"60d1f5eb-0222-4a84-879b-6699b0cfc1a4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bd"
         },
         {
            "Name":"DLF Colony",
            "conditionId":"60d1f5eb-0222-4a84-879b-7749b0cfc1a4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bd"
         }
      ]
   },
   {
      "Name":"Pune",
      "id":"c5d58bef-f1c2-4b7c-a6d7-f64df12321ax",
      "Towns":[
         {
            "Name":"Viman Nagar",
            "conditionId":"60d1f5eb-0222-4a84-879b-6699b0cfc1x4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321ax"
         },
         {
            "Name":"Magarpatta",
            "conditionId":"60d1f5eb-0222-4a84-879b-7749b0cfc1f4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bax"
         }
      ]
   }
]

我正在使用 js map 进行迭代,但对如何复制确切的结构感到困惑。

好吧,仅 map 不足以解决您的问题,因为您有两个嵌套数组。也许你可以考虑使用map两次的可能性? 例如:

var cid = "c5d58bef-f1c2-4b7c-a6d7-f64df12321ax";
var newName = "Viman Nagar";
City = City.map(function(city) {
  city.towns = city.towns.map(function(town) {
    if (town.cid === cid)
      town.name = newName;
    return town;
  });
  return city;
});

将您的对象归因于

let cities = [{
    "Name": "Delhi"
     ...
}]

然后你可以映射它

let result = cities.map(city => city.Towns.map(town => {
    if (town.Name === "Hadapsar") {
        return {
            ...town,
            Name: "Viman Nagar"
        }
    } else return town
}))

使用Array#map如下:

  • 遍历 cities
  • 在每次迭代中,迭代 Towns。如果当前城镇的 cid 等于要更改的城镇,则更新其 Name

const changeTownName = (cities = [], cid, name) =>
  cities.map(({ Towns = [], ...props }) => ({
    ...props,
    Towns: Towns.map(town => town.cid === cid 
      ? { ...town, Name: name } 
      : { ...town }
    )
  }));

const cities = [
  { Name: 'Delhi', id: 'c5d58bef-f1c2-4b7c-a6d7-f64df12321bd', Towns: [ { Name: "MG Colony", conditionId: '60d1f5eb-0222-4a84-879b-6699b0cfc1a4', cid: 'c5d58bef-f1c2-4b7c-a6d7-f64df12321bd' }, { Name: "DLF Colony", conditionId: '60d1f5eb-0222-4a84-879b-7749b0cfc1a4', cid: 'c5d58bef-f1c2-4b7c-a6d7-f64df12321bd' } ] },
  { Name: 'Pune', id: 'c5d58bef-f1c2-4b7c-a6d7-f64df12321ax', Towns: [ { Name: "Hadapsar", conditionId: '60d1f5eb-0222-4a84-879b-6699b0cfc1x4', cid: 'c5d58bef-f1c2-4b7c-a6d7-f64df12321ax' }, { Name: "Magarpatta", conditionId: '60d1f5eb-0222-4a84-879b-7749b0cfc1f4', cid: 'c5d58bef-f1c2-4b7c-a6d7-f64df12321bax' } ] }
];
console.log( changeTownName(cities, 'c5d58bef-f1c2-4b7c-a6d7-f64df12321ax', 'Viman Nagar') );

如果您将 city 视为城市,此代码可以帮助您;

cities.forEach(city => {
    city.Towns = city.Towns.map(el => {
        if (el.Name === 'Hapdasar') {
            el.Name = 'Viman Nagar';
        }
        return el;
    })
});

您需要循环遍历数组中的每个城市,以及城市中的每个城镇。如果cid与城镇的cid匹配,则更改它;

const myNewTownName = "Viman Nagar";
const cid = "c5d58bef-f1c2-4b7c-a6d7-f64df12321ax";
for(let i = 0; i < myObj.City.length; i++){
    const city = myObj.City[i];
    for(let j = 0; j < city.Towns.length; j++){
        const town = city.Towns[j];
        if(cid === town.cid){
            town.Name = myNewTownName;
        }
        city.town[j] = town;//Updates city with the updated town
    }
    myObj.City[i] = city; //Updates myObj with the updated city
}

也可以使用嵌套 .forEach 循环来解析外部和内部数组,并使用 if 块检查目标城镇的 cid 来获得结果。

const data = {
"City":[
   {
      "Name":"Delhi",
      "id":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bd",
      "Towns":[
         {
            "Name":"MG Colony",
            "conditionId":"60d1f5eb-0222-4a84-879b-6699b0cfc1a4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bd"
         },
         {
            "Name":"DLF Colony",
            "conditionId":"60d1f5eb-0222-4a84-879b-7749b0cfc1a4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bd"
         }
      ]
   },
   {
      "Name":"Pune",
      "id":"c5d58bef-f1c2-4b7c-a6d7-f64df12321ax",
      "Towns":[
         {
            "Name":"Hadapsar",
            "conditionId":"60d1f5eb-0222-4a84-879b-6699b0cfc1x4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321ax"
         },
         {
            "Name":"Magarpatta",
            "conditionId":"60d1f5eb-0222-4a84-879b-7749b0cfc1f4",
            "cid":"c5d58bef-f1c2-4b7c-a6d7-f64df12321bax"
         }
      ]
   }
]

} // end data;


const targetCid = "c5d58bef-f1c2-4b7c-a6d7-f64df12321ax"; // cid for Hadapsar;

const objArray = data.City;

objArray.forEach(element => {
  
  element.Towns.forEach(element => {  
  
    if (element.cid == targetCid) {
      element.Name = "Viman Nagar";
    } // end if;
  
  }); // next object in Towns array;

});  // next object in objArray;
  


document.getElementById('output').textContent = JSON.stringify(data, undefined, 2);
#output {
 white-space: pre;
}
<pre id="output"></pre>