使用常量访问 JSON



我的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.video1return 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);

最新更新