util.js
1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
export const cloneDeep = (obj) => {
if (typeof obj !== 'object') {
return obj;
}
if (!obj) {
return obj;
}
if (obj instanceof Date) {
return new Date(obj);
}
if (obj instanceof RegExp) {
return new RegExp(obj);
}
if (obj instanceof Function) {
return obj;
}
let newObj;
if (obj instanceof Array) {
newObj = [];
for(let i = 0, len = obj.length; i < len; i++){
newObj.push(cloneDeep(obj[i]));
}
return newObj;
}
newObj = {};
for(let key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] !== 'object') {
newObj[key] = obj[key];
} else {
newObj[key] = cloneDeep(obj[key]);
}
}
}
return newObj;
};
export const get = (obj, dotSeparatedKeys) => {
if (dotSeparatedKeys !== undefined && typeof dotSeparatedKeys !== 'string') return undefined;
if (typeof obj !== 'undefined' && typeof dotSeparatedKeys === 'string') {
// split on ".", "[", "]", "'", """ and filter out empty elements
const splitRegex = /[.\[\]'"]/g; // eslint-disable-line no-useless-escape
const pathArr = dotSeparatedKeys.split(splitRegex).filter(k => k !== '');
// eslint-disable-next-line no-param-reassign, no-confusing-arrow
obj = pathArr.reduce((o, key) => (o && o[key] !== undefined ? o[key] : undefined), obj);
}
return obj;
};
export const set = (obj, dotSeparatedKeys, value) => {
const splitRegex = /[.\[\]'"]/g;
const pathArr = dotSeparatedKeys.split(splitRegex).filter(k => k !== '');
const key = pathArr.pop();
pathArr.reduce((o, k) => {
if (o && o[k] === undefined || o[k] === null) {
o[k] = !isNaN(Number(key)) ? [] : {}
}
return o[k]
}, obj)[key] = value
// pathArr.reduce((o, key) => (o && o[key] !== 'undefined' ? o[key] : undefined), obj)[key] = value
};
export default {
cloneDeep,
get,
set
}