/**
* ========================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========================
*/