util-10.JSON操作相關(jsonUtil)

/**
 * ========================10.json操作 s========================
 */
var jsonUtil = {
    /**
     * 對象||數組||json數組深拷貝
     */
    "objDeepCopy": function(source) {
        var sourceCopy = source instanceof Array ? [] : {};
        for (var item in source) {
            sourceCopy[item] = typeof source[item] === 'object' ? objDeepCopy(source[item]) : source[item];
        }
        return sourceCopy;
    },

    /**
     * clone對象
     */
    "cloneObj": function(obj) {
        var newObj = {};
        for (var prop in obj) {
            newObj[prop] = obj[prop];
        }
        return newObj;
    },
    /**
     * clone對象---深克隆
     */
    "deepClone": function(obj){
        var resObj = {};
        for(key in obj){/*key/in循環*/
            if(obj[key] instanceof Object){/*如果屬性是對象,則再次調用clone()(遞歸)*/
                resObj[key] = clone(obj[key]);
            }else{
                resObj[key] = obj[key];/*clone*/
            }
        }
        return resObj;/*返回resObj*/
    },
    /**
     * 計算json元素個數
     */
    "getJsonLen": function(obj) {
        var size = 0, key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                size++;
            }
        }
        return size;
    },

    /**
     * 判斷obj是否含有propertyName屬性,該方法會忽略掉那些從原型鏈上繼承到的屬性
     * @param obj
     * @param propertyName
     * @returns {boolean}
     */
    "hasOwnProperty" : function(obj,propertyName){
        return obj.hasOwnProperty(propertyName);
    },

    /**
     * 返回所有屬性名數組
     * @param obj
     * @returns {*}
     */
    "getPropertyNames" : function(obj){
        return Object.getPropertyNames(obj);
    },

    /**
     * 獲取所有屬性(可枚舉屬性&不可枚舉屬性)及對應值
     * @param obj
     */
    "getPropertyNamesVals" : function(obj){
        /**
         * propertyName元素的值,
         * ind元素的索引,
         * array被遍歷的數組
         */
        Object.getPropertyNames(obj).forEach(function(propertyName,ind,array){
            console.log(propertyName + " -> " + obj[propertyName],ind,array);
        });
    },

    /**
     * 獲取可枚舉屬性
     * @param obj
     * @returns {string[]}
     */
    "getEnumerableKeys" : function(obj){
        //Object.keys只能返回對象本身具有的可枚舉屬性,不包含prototype定義的屬性,否則用for in
        return Object.keys(obj);
    },

    /**
     * 獲取不可枚舉屬性
     * @param obj
     */
    "getUnEnumerableKeys" : function(obj){
        var allKeys = Object.getPropertyNames(obj);
        var enumerableKeys = Object.keys(obj);
        var UnEnumerableKeys = allKeys.filter(function(propertyName, ind, array){
            var idx = enumerableKeys.indexOf(propertyName);
            if(idx == -1){
                return true;
            }else{
                return false;
            }
        });
    },

    /**
     * 一維數組操作:增刪排序
     */
    "oneArrayJsonUtil" : function(){
        var arr = ["A-option1","B-option2","C-option3","D-option4"];
        arr.push("E-option5");  //增
        //刪增: 索引爲1的選項開始刪除1項,再在該位置添加一新項
        arr.splice(1,1,"B-New-option2");

        arr.sort(function(a,b){ //升序排序
            return a-b;  //或者: return a>b;
        });

        arr.sort(function(a,b){ //降序排序
            return b-a;  //或者: return a<b;
        });
    },

    /**
     * json二維數組操作:增刪排序
     */
    "twoArrayJsonUtil" : function(){
        /*json增加刪除*/
        var test = {};
        test["key1"] = "val1";  //增
        delete test["key1"];  //刪

        var arr = [{"name":"name1","age":12},{"name":"name2","age":18},{"name":"name3","age":15}];
        arr.push({"name":"name4", "age":9});  //增
        //刪增: 索引爲1的選項開始刪除1項,再在該位置添加一新項
        arr.splice(1,1,{"name":"name2","age":2});

        /**
         * 定義排序:
         * @param field  //排序字段
         * @param reverse //是否升序
         * @param primer  //排序字段數據類型
         * @returns {function(*=, *=)}
         */
        var sort_by = function(field, reverse, primer){

            var key = primer ?
                function(x) {return primer(x[field])} :
                function(x) {return x[field]};

            reverse = [-1, 1][+!!reverse];

            return function (a, b) {
                return a = key(a), b = key(b), reverse * ((a > b) - (b > a));
            }
        };

        //數組sort方法默認按升序排序
        arr_sort=arr.sort(sort_by('age', true, parseInt)); //根據age,升序
        arr_sort=arr.sort(sort_by('name', false, '')); //根據name,倒序  
    },

    /**
     * json對象合併(數組使用concat)
     需求:設有對象 o1 ,o2,需要得到對象o3
     var o1 = { a:'a' }, o2 = { b:'b' };
     // 則
     ===> var o3 = { a:'a', b:'b' };
     */
    "concatJson": function(){
        /**
         * 方法1:使用JQuery的extend方法
         * 方法定義**:jQuery.extend([deep], target, object1, [objectN])
         > 用一個或多個其他對象來擴展一個對象,返回被擴展的對象。
         > 如果不指定target,則給jQuery命名空間本身進行擴展。這有助於插件作者爲jQuery增加新方法。 如果第一個參數設置爲true,則jQuery返回一個深層次的副本,遞歸地複製找到的任何對象(遞歸合併)。否則的話,副本會與原對象共享結構。 未定義的屬性將不會被複制,然而從對象的原型繼承的屬性將會被複制。
         * @type {{a: string}}
         */
        var o1 = { a:'a' },
            o2 = { b:'b' };

        o3 = $.extend(o1, o2);  // 合併 o1 和 o2, 將結果返回給 o3. 注意: 此時,o1 == o3! 即 o1 被修改
        // 或
        o3 = $.extend({}, o1, o2); // 合併 o1 和 o2, 將結果返回給 o3. 注意: 此時,o1 != o3! 即 o1 沒有被修改

        /**
         * 方法2:用 Object.assign();
         * @type {{a: number}}
         */
        var o1 = { a: 1 };
        var o2 = { b: 2 };
        var o3 = { c: 3 };

        var obj = Object.assign(o1, o2, o3);
        console.log(obj); // { a: 1, b: 2, c: 3 }
        console.log(o1);  // { a: 1, b: 2, c: 3 }, 注意目標對象自身也會改變。

        /**
         * 方法3:遍歷賦值法
         * @param o
         * @param n
         */
        var extend=function(o,n){
            for (var p in n){
                o[p]=n[p];
            }
        };
        //類似於直接賦值增加屬性:
        o3=o1;
        o3['b']='b';
        // o3 ={ o1:'a', o2:'b' };
    }
};

function Person(){
    this.name = "xxx";
}
Person.prototype.sex = "男";
Person.prototype = {
    "grade" : "1年級",
    "age" : 12
};

var person1 = new Person();
Object.defineProperty(person1,"favorites",{
    "value" : "fa",
    "enumerable" : true
})

for(var i in person1){
    console.log(i,person1[i]);
}
console.log(Object.keys(person1));
console.log(Object.getPropertyNames(person1));


/**
 *   jQuery之$.extend()的js實現方法
 eg:
 var options=window.extend(defaultObj,optionsObj);
 */
void function(global){
    var _isObject = function(o){
        return Object.prototype.toString.call(o) === '[object Object]';
    }

    var _extend = function self(destination, source) {
        var property;
        for (property in destination) {
            if (destination.hasOwnProperty(property)) { // 若destination[property]和source[property]都是對象,則遞歸
                if (_isObject(destination[property]) && _isObject(source[property])) {
                    self(destination[property], source[property]);
                } // 若source[property]已存在,則跳過
                if (source.hasOwnProperty(property)) {
                    continue;
                } else {
                    source[property] = destination[property];
                }
            }
        }
    }

    var extend = function(){
        var arr = arguments;
        var result = {};
        var i;
        if (!arr.length)
            return {};
        for (i = arr.length - 1; i >= 0; i--) {
            if (_isObject(arr[i])) {
                _extend(arr[i], result);
            };
        }

        arr[0] = result; return result;
    }

    global.extend = extend;
}(window)

/**
 * ========================10.json操作 e========================
 */

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章