muzidigbig-utils-npm
Version:
一个日常开发积累的工具包。 每次 npm publish 都需要修改 package.json version版本号保证其唯一。
130 lines (122 loc) • 3.54 kB
JavaScript
/**
* 浅拷贝
* var obj1 = {
'name' : 'zhangsan',
'age' : '18',
'language' : [1,[2,3],[4,5]],
};
var obj2 = shallowCopy(obj1);
Object.assign({}, obj1);
*/
function shallowClone(initalObj) {
var result = {};
for (var prop in initalObj) {
if (initalObj.hasOwnProperty(prop)) {
result[prop] = initalObj[prop];
}
}
return result;
}
/**
* 深拷贝
* var obj1 = {
name:{username:'muzi'},
age:22,
arr:[1,2,3,4],
say:function() {
console.log(this.name.username);
}
}
var obj2 = deepClone(obj1);
JSON.parse(JSON.stringify(obj1)); // undefined和函数无法赋值
*/
function deepClone(initalObj) {
// 要判断 initalObj 是对象还是数组
if (Array.isArray(initalObj)) {
// 数组
var result = [];
for (let i = 0; i < initalObj.length; i++) {
result.push(deepClone(initalObj[i]))
}
} else if (typeof initalObj == "object") {
// 对象
var result = {};
for (var key in initalObj) {
// 递归之后的原来的值
result[key] = deepClone(initalObj[key]);
}
} else {
// 基本类型
var result = initalObj;
}
return result;
}
function deep(obj) {
// 判断数据类型是否是数组/对象 进行新数据声明
// 新建一个新的地址
if (!(obj instanceof Object) || !(obj instanceof Array)) { return obj }
var targetObj = obj instanceof Array ? [] : {};
// 循环 obj
for (const key in obj) {
// 忽略从原型继承的属性,不进行拷贝
if (obj.hasOwnProperty(key)) {
const value = obj[key]; //对应的value
// 判断 value 是否是数组对象?
if (value instanceof Array || value instanceof Object) {
// 递归复制新的地址数据
targetObj[key] = deep(value)
} else {
targetObj[key] = value
}
}
}
return targetObj
}
/**
* 一般用于深拷贝后端接口数据;不适用于函数、undefined和symbol 类型
* @param {array | object} obj
* @returns {array | object}
*
* 可能存在一下问题:
* 1.undefined、function、symbol 在转换后直接被忽略了
* 2.正则表达式转换成对象,日期转换成字符串
* 3.NaN、Infinity 直接变成 null
*/
function deepCopyByJSON(obj) {
return JSON.parse(JSON.stringify(obj))
}
/**
* 深拷贝:通过指定属性进行深拷贝
*/
// deepCopyWithJsonAttrs(json,['name'])
/**
* 深拷贝:通过指定属性进行深拷贝
* @param {object | array} obj
* @param {array} attrs
* @returns {object}
*
* var obj = {
"name": "muzidigbig",
"age": "18",
"lists": [
{"name": "xxx1", "age": "28"},
{"name": "xxx2", "age": "29"},
{"name": "xxx3", "age": "30"}
]
};
* deepCopyWithJsonAttrs(obj,['name']) => {name: 'muzidigbig'}
*/
const deepCopyWithJsonAttrs = (obj, attrs = []) => {
if (!Array.isArray(obj)) {
return attrs.length > 0 ? JSON.parse(JSON.stringify(obj, attrs)) : JSON.parse(JSON.stringify(obj))
}else{
return attrs.length > 0 ? JSON.parse(JSON.stringify(attrs.map(index => obj[index]).filter(item => item !== undefined))) : JSON.parse(JSON.stringify(obj))
}
}
export {
shallowClone,
deepClone,
deep,
deepCopyByJSON,
deepCopyWithJsonAttrs,
}