Ключ подкачки со значением во вложенном объекте javascript

#javascript #arrays #json #object #ecmascript-6

Вопрос:

Итак, у меня есть этот объект:

 {  "images": [  {  "key": "ASDV1-01.jpg",  "image_location": "image1.jpg",  "data": {  "documentid": "CE44DBAC-59B2-4178-8392-0141FB2F58DF",  "scandate": "Feb 1 2018 12:05PM",  "F08": "1",  "F09": "",  "F10": "101076",  "F11": ""  },  "crops": {  "F08": {  "rectangle": {  "left": 690,  "top": 2111,  "width": 597,  "height": 121  }  },  "F09": {},  "F10": {  "rectangle": {  "left": 653,  "top": 821,  "width": 653,  "height": 243  }  },  "F11": {}  }  },  {  "key": "ASDV1-01.jpg",  "image_location": "image.png",  "crops": {  "F05": {  "rectangle": {  "left": 0,  "top": 808,  "width": 624,  "height": 243  }  }  },  "metadata": [  {  "name": "colors",  "data": {  "dimensions": {  "width": 2000,  "height": 2600  },  "coordinates": {  "width": {  "x": {  "lat": 4,  "long": [12, 345]  },  "y": {  "lat": {  "x" : [12,345],  "y": "234"  },  "long": 123  }  }  }  }  }  ]  },  {  "key": "ASDV1-02.jpg",  "image_location": "image.png"  }  ] }  

и я хочу поменять местами ключи со значениями, чтобы это выглядело примерно так:

 "ASDV1-01.jpg": "key",  "image.jpg": "image_location",  "data": {  "CE44DBAC-59B2-4178-8392-0141FB2F58DF": "documentid",  "Feb 1 2018 12:05PM": "scandate",  "1": "F08",  "101076": "F10",  

Это мой код, но он не работает. Я продолжал пытаться использовать определенные функции javascript и просто не могу этого понять. Кроме того, я хотел бы отобразить результат в виде строки JSON. Можете ли вы дать мне какие-либо подсказки о том, как это сделать?

 function swap(json){  var ret = {};  for(var key in json){  ret[json[key]] = key;  }  return ret; }  var result = swap(data) console.log(JSON.stringify(result, null, 2));  

Комментарии:

1. Почему ты хочешь это сделать? "ASDV1-01.jpg": "key" в этом нет никакого смысла.

2. Что произойдет, если у вас есть массив или объект в качестве значения?

3. @Andy Часто бывает интересно получить доступ к ключу из значения

4. Почему вы хотите это сделать (если бы мы поняли, что могли бы предложить лучшее решение)? И что не так с текущим кодом (вы не объяснили, как он выходит из строя)?

5. Объекты могут иметь только строки в качестве свойств, и вы также хотите, чтобы это было рекурсивно (поменять местами все вложенные свойства?) вам нужно добавить пояснения.

Ответ №1:

измените свою функцию на рекурсивную, как это, я думаю, это вам поможет

 let data = {  "images": [{  "key": "ASDV1-01.jpg",  "image_location": "image1.jpg",  "data": {  "documentid": "CE44DBAC-59B2-4178-8392-0141FB2F58DF",  "scandate": "Feb 1 2018 12:05PM",  "F08": "1",  "F09": "",  "F10": "101076",  "F11": ""  },  "crops": {  "F08": {  "rectangle": {  "left": 690,  "top": 2111,  "width": 597,  "height": 121  }  },  "F09": {},  "F10": {  "rectangle": {  "left": 653,  "top": 821,  "width": 653,  "height": 243  }  },  "F11": {}  }  },  {  "key": "ASDV1-01.jpg",  "image_location": "image.png",  "crops": {  "F05": {  "rectangle": {  "left": 0,  "top": 808,  "width": 624,  "height": 243  }  }  },  "metadata": [{  "name": "colors",  "data": {  "dimensions": {  "width": 2000,  "height": 2600  },  "coordinates": {  "width": {  "x": {  "lat": 4,  "long": [12, 345]  },  "y": {  "lat": {  "x": [12, 345],  "y": "234"  },  "long": 123  }  }  }  }  }]  },  {  "key": "ASDV1-02.jpg",  "image_location": "image.png"  }  ] }  let ret = {};  function swap(json) {  for (var key in json) {  if (typeof json[key] === "object") {  swap(json[key])  } else {  ret[json[key]] = key;  }  } }  swap(data) console.log(ret);