对象克隆及属性转换-JavaScript

在某些项目中,需要将一些返回信息进行其他语言的翻译,可以为不同语言用户提供不同的语言版本。下面是一个实现:

 

/**
 * @class Translate
 * @description 查询字典,翻译成相应的语言
 * @author jerishi
 * @2016.6.15
 */
var mapObj = {
    'test01': '测试01',
    'test02': '测试02',
    'test03': '测试03',
    'test04': '测试04'
};
var targetObj = {
    '1': 'test01',
    '2': 'test02',
    '3': undefined,
    '4': {
        '4': 'test04',
        '3': 'test03',
        '2': 'test02'
    },
    '5': {
        '1': 'test01',
        '2': 'test02',
        '3': 'test03',
        '4': {
            '4': 123,
            '3': 'test03',
            'G': ['test03', 'test02', 3]
        }
    }
};

var Translate = {
    /**
     * 克隆对象
     * @param  {object} obj 
     * @return {object}  
     */
    clone: function(obj) {
        var _self = this;
        // 简单数据类型直接返回
        if (obj == null) {
            return obj;
        }
        if (typeof obj != 'object') {
            return obj;
        }
        // 复制复杂对象
        var result = new obj.constructor();
        for (var prop in obj) {
            result[prop] = _self.clone(obj[prop]);
        }
        return result;
    },
    /**
     * 从字典里寻找目标词汇翻译
     * @param  {object} mapTest 字典对象
     * @param  {string} target  目标词汇
     * @return {string}         返回目标词汇查询结果
     */
    mapStr: function(mapObj, target) {
        // 默认值
        var result = target;
        // 查询字典
        $.each(mapObj, function(key, value) {
            if (key === target) {
                result = value;
            }
        });
        return result;
    },
    /**
     * 翻译对象属性值(深层遍历)
     * @param  {object} dictionaryObj 字典对象
     * @param  {object} targetObj     目标对象
     * @return {object}               翻译结果
     */
    mapObj: function(dictionaryObj, targetObj) {
        var _self = this;
        for (var prop in targetObj) {
            var target = targetObj[prop];
            if (typeof target == 'string') {
                targetObj[prop] = _self.mapStr(dictionaryObj, target);
            } else {
                _self.mapObj(dictionaryObj, target);
            }
        }
        return targetObj;
    },
    /**
     * 克隆目标对象,并翻译
     * @param  {object} dictionaryObj 字典对象
     * @param  {object} targetObj     目标对象
     * @return {object}               翻译结果
     */
    translate: function(dictionaryObj, targetObj) {
        var _self = this;
        // 克隆目标对象,不影响原对象
        var _targetObj = _self.clone(targetObj);
        // 翻译对象属性值
        var result = _self.mapObj(dictionaryObj, _targetObj);
        return result;
    }
}

console.log(Translate.translate(mapObj, targetObj));
console.log(targetObj);

 

posted @ 2016-06-16 11:03  默语  阅读(308)  评论(0编辑  收藏  举报