基于函数参数返回嵌套对象值

时间:2013-11-19 22:05:22

标签: javascript function logic

我正在尝试完成练习,而不是单击。

这是一个问题:你能用JS(或Cof​​fescript或任何实际有意义的语言)写一个方法getTranslation(lang,path) - >以下列方式工作的字符串: 你有这个全局对象:

strings = {
    home: {
        intro: {
            en: 'Welcome',
            fr: 'Bienvenue'
        },
        content: {
            explanation: {
                en: 'This is an interesting exercise',
                fr: 'C\'est un exercice intéressant',
                de: 'Es ist eine interesante Übung'
            },
            contact: 'Contact',
            goodbye: {
                en: 'Goodbye',
                fr: 'Au revoir',
                es: 'Adios'
            }
        }
    }
}

getTranslation('home.intro', 'fr') // => 'Bienvenue'
getTranslation('home.content.contact', 'fr') // => 'Contact'
getTranslation('home.intro', 'es') // => 'Welcome'
getTranslation('home.content.goodbye') // => 'Goodbye'
getTranslation('unvalid.path','en') // => ''

所以第一个参数是一个字符串,用于描述通过点分隔的键的路径(假设没有键中的点),第二个参数是语言,如果没有提供或不存在,则回退到'en'(我们还假设在每个分支的末尾,“en”键存在,或者它是一个单独的字符串,如home.content.contact)。

这是我到目前为止我的答案,但我知道我做错了,因为没有回来。

function getTranslation (path, lang) {

    lang = lang || "en";

    var strings = {
        home: {
            intro: {
                en: 'Welcome',
                fr: 'Bienvenue'
        },
        content: {
            explanation: {
                en: 'This is an interesting exercise',
                fr: 'C\'est un exercice intéressant',
                de: 'Es ist eine interesante Übung'
            },
            contact: 'Contact',
            goodbye: {
                en: 'Goodbye',
                fr: 'Au revoir',
                es: 'Adios'
            }
        }
    }

    if (path == 'home.content.contact') {
        return strings.path;
    } else if (path == 'unvalid.path') {
        return '';
    } else {
        return strings.path.lang;
    }
}

getTranslation('home.intro', 'fr'); // => 'Bienvenue'
getTranslation('home.content.contact', 'fr'); // => 'Contact'
getTranslation('home.intro', 'es'); // => 'Welcome'
getTranslation('home.content.goodbye'); // => 'Goodbye'
getTranslation('unvalid.path','en'); // => ''

感谢愿意提供帮助的任何人。

4 个答案:

答案 0 :(得分:2)

不确定它是否是最佳解决方案,但它能满足您的所有需求。

function getTranslation(path, lang) {

    lang = lang || "en";
    strings = {
        home: {
            intro: {
                en: 'Welcome',
                fr: 'Bienvenue'
            },
            content: {
                explanation: {
                    en: 'This is an interesting exercise',
                    fr: 'C\'est un exercice intéressant',
                    de: 'Es ist eine interesante Übung'
                },
                contact: 'Contact',
                goodbye: {
                    en: 'Goodbye',
                    fr: 'Au revoir',
                    es: 'Adios'
                }
            }
        }
    }
    path = path.split(".");
    var result = strings;
    for(var i in path){
        result = result[path[i]];
        if(result == undefined){
            return '';
        }
    }
    return (result[lang]==undefined)?"":result[lang];
}

答案 1 :(得分:0)

function getTranslation (path, lang) {

                lang = lang || "en";

                var strings = {
                    home: {
                        intro: {
                            en: 'Welcome',
                            fr: 'Bienvenue'
                    },
                    content: {
                        explanation: {
                            en: 'This is an interesting exercise',
                            fr: 'C\'est un exercice intéressant',
                            de: 'Es ist eine interesante Übung'
                        },
                        contact: 'Contact',
                        goodbye: {
                            en: 'Goodbye',
                            fr: 'Au revoir',
                            es: 'Adios'
                        }
                    }
                }
            };
            var string = eval('strings.' + path);
            return string[lang];
            }

不是这个解决方案的粉丝,因为我避免了逃避,但它解决了你的问题。试试你的函数调用。

jsfiddle

答案 2 :(得分:0)

return strings.path;

不会返回任何内容,因为字符串对象上没有“path”属性。

你想:

return strings[path];

...但只有当您的媒体资源处于对象中的第一个级别时,此功能才有效。例如......

strings['home'];

会给你和像

这样的对象
{intro: {
    en: 'Welcome',
    fr: 'Bienvenue'
}}

但是,尝试按名称访问嵌套属性(如下所示)将返回undefined:

strings['home.intro']

因此,您需要. split路径字符串,循环生成的数组,并逐个获取每个属性。

我会把实施留给你,因为你提到它是一个练习,但如果你遇到困难,可以随时提问。

答案 3 :(得分:0)

我认为你遇到的部分困难是你有一些想要运行的JavaScript代码,但是它被困在一个字符串中。

我相信当你说

return strings.path.lang

您希望执行此操作(假设path = 'home.intro'lang = 'fr'

return strings.home.intro.fr

不是这个:

return strings.'home.intro'.'fr'

您可以使用evalpath评估为所需的代码,但eval会导致安全漏洞。

我会通过在path字符上拆分.字符串来解决此问题。

这是我写的一个快速功能:

function getTranslation (path, lang, obj) {

    obj = obj || strings;
    lang = lang || "en";

    var dotIndex = path.indexOf('.');

    if(dotIndex === -1) {
    return obj[path][lang];
}
else
{
    var firstFromPath = path.substring(0, dotIndex);
    var restPath = path.substring(dotIndex + 1);
    return getTranslation(restPath, lang, obj[firstFromPath]);
}

这并不是你想做的一切,但希望它有所帮助。