我的JSON如下所示:
{
flight_number: 1,
mission_name: "FalconSat",
rocket: {
rocket_id: "falcon1",
rocket_name: "Falcon 1",
rocket_type: "Merlin A",
first_stage: {
cores: [
{
core_serial: "Merlin1A",
flight: 1
}
]
},
fairings: {
reused: false,
recovery_attempt: false,
recovered: false,
ship: null
}
},
links: {
video_link: "https://www.youtube.com/watch?v=0a_00nJ_Y88",
flickr_images: [ ]
},
details: "Engine failure at 33 seconds and loss of vehicle"
}
要访问视频链接,我想使用一个常量,并且我一直在尝试使用:
const links = "links";
const video1 = links + ".video_link"; // this doesn't work
const video2 = "links.video_link"; // this doesn't work
const det = "details";
getVideoURL(something) {
console.log(something.video1); // undefined
console.log(something.links.video_link); // this works
console.log(something.det); // this works
return something.video2;
}
getDetails(something) {
return something.det; // this works
}
// the jsonObject is retrieved by an async function, i just simplified it. I hope this makes sense.
const jsonObject = await axios("https://api.spacexdata.com/v3/launches");
let url = getVideoURL(jsonObject);
let det = getDetails(something);
console.log(url) // undefined
console.log(det) // prints out details.
有没有办法获取视频 URL,就像我使用 return something.video1
或return something.video2
getDetails
一样?
使用数组而不是字符串,然后您可以使用 reduce
遍历数组中的每个键,访问适当的嵌套属性值,传入整个对象作为累加器的初始值a
:
const obj = {flight_number:1,mission_name:"FalconSat",rocket:{rocket_id:"falcon1",rocket_name:"Falcon 1",rocket_type:"Merlin A",first_stage:{cores:[{core_serial:"Merlin1A",flight:1}]},fairings:{reused:!1,recovery_attempt:!1,recovered:!1,ship:null}},links:{video_link:"https://www.youtube.com/watch?v=0a_00nJ_Y88",flickr_images:[]},details:"Engine failure at 33 seconds and loss of vehicle"};
const getVideoURL = obj => path.reduce((a, prop) => a[prop], obj);
const path = ['links', 'video_link'];
const url = getVideoURL(obj);
console.log(url);
或者,如果你想使用一个字符串,你必须先在.
上拆分:
const pathString = "links.video_link";
const getVideoURL = obj => pathString
.split('.')
.reduce((a, prop) => a[prop], obj);