打字稿从内部对象获取属性的简单方法

时间:2017-07-27 09:33:04

标签: typescript

我有这个对象结构:

let data = {
   prop1 = {
        prop11 = {
          prop111 = 'hello'
        },
        prop12 = {...}
   },
   prop2= {...}
}

我有这个格式化的字符串:'data.prop1.prop11.prop111'

我想将此字符串映射到数据结构并获取值(在此示例中为“hello”)。它的一般数据结构,我不知道属性的名称是如何(不是固体属性名称)。 这是怎么做的简单方法?可能我需要解析字符串到数组然后呢?

感谢您的建议

1 个答案:

答案 0 :(得分:1)

我几个月前创建了一个类似的功能,

假设你有这个对象:

var obj = {
    data: {
        prop1: {
            prop11: {
                prop111: 'hello'
            },
            prop12: "12"
        },
        prop2: "1"
    }
}

然后,您可以使用此功能(JavaScript):

function getDescendantProp(obj, desc) {
    var arr = desc.split(".");
    if (arr.length > 0 && arr[0] !== "") {
        while (arr.length) {
            var name = arr.shift();
            if (name in obj) {
                obj = obj[name];
            } else {
                console.warn('[getDescendantProp] - ' + name + ' property does not exists.');
                return undefined;
            }
        }
    }
    return obj;
}

TypeScript代码:

function getDescendantProp(obj: {[key: string]: {}}, desc: string) {
    if (obj === null || obj === undefined || desc === "") {
        return undefined;
    }
    const arr: string[] = desc.split(".");
    if (arr.length > 0 && arr[0] !== "") {
        while (arr.length) {
            const name: string | undefined = arr.shift();
            if ((typeof name === "string") && (name in obj)) {
                obj = obj[name];
            } else {
                console.warn("[getDescendantProp] - " + name + " property does not exists.");
                return undefined;
            }
        }
    }
    return obj;
}

并使用它:

getDescendantProp(obj, "data.prop1.prop11.prop111") // hello