-
Notifications
You must be signed in to change notification settings - Fork 10
/
ObjectToolkit.js
139 lines (131 loc) · 4.2 KB
/
ObjectToolkit.js
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
* This file is part of the Spludo Framework.
* Copyright (c) 2009-2010 DracoBlue, http://dracoblue.net/
*
* Licensed under the terms of MIT License. For the full copyright and license
* information, please see the LICENSE file in the root folder.
*/
/**
* @class A toolkit for convenient functions on javascript objects.
*/
ObjectToolkit = {
/**
* This little method expands an object as long as the path needs to be
* expanded to allow setting a property.
*
* So if you object is something like that:
*
* <pre>
* a = {
* "b": {}
* }
* </pre>
*
* and you want to create
*
* <pre>
* a = {
* "b": {
* "c": {
* "d": "hallo"
* }
* }
* }
* </pre>
*
* you would just have to use:
*
* <pre>
* ObjectToolkit.setPathValue(a, "hallo", [
* "b", "c", "d"
* ]);
* </pre>
*
* @param {Object}
* [entity={}] The object to apply the path to.
* @param {Object|String|Number|null}
* value The value to apply to the path
* @param {Array}
* path The path to apply the value to.
*
* @return {Object} The modified (or newly created) object
*/
setPathValue: function(entity, path, value) {
return this.rawSetPathValue(entity || {}, path, value, 0, path.length);
},
/**
* This little magic method does the opposite to ObjectToolkit.setPathValue.
*
* @param {Object}
* [entity] The object to retrieve the path from.
* @param {Array}
* path The path to retrieve the value from.
*
* @return {Object|String|Number|null} The value or undefined
*/
getPathValue: function(entity, path) {
return this.rawGetPathValue(entity, path, 0, path.length);
},
/**
* This magic little method expands an object as long as the path needs to
* be expanded to allow setting a property.
*
* @private
*
* @param {Object}
* [entity={}] The object to apply the path to.
* @param {Object|String|Number|null}
* value The value to apply to the path
* @param {Array}
* path The path to apply the value to.
* @param {Number}
* path_position The position in the path (for performance
* reasons)
* @param {Number}
* path_length The lengths of the path (for performance reasons)
*
* @return {Object} The modified (or newly created) object
*/
rawSetPathValue: function(entity, path, value, path_position, path_length) {
/*
* It's the final one, let's set the value and we're done!
*/
if (path_position + 1 === path_length) {
entity[path[path_position]] = value;
} else {
entity[path[path_position]] = this.rawSetPathValue(entity[path[path_position]] || {}, path, value, path_position + 1,
path_length);
}
return entity;
},
/**
* This little magic method does the opposite to
* ObjectToolkit.rawSetPathValue.
*
* @private
*
* @param {Object}
* [entity] The object to retrieve the path from.
* @param {Array}
* path The path to retrieve the value from.
* @param {Number}
* path_position The position in the path (for performance
* reasons)
* @param {Number}
* path_length The lengths of the path (for performance reasons)
*
* @return {Object|String|Number|null} The value or undefined
*/
rawGetPathValue: function(entity, path, path_position, path_length) {
if (!entity) {
return entity;
}
/*
* It's the final one, let's retrieve the value and we're done!
*/
if (path_position + 1 === path_length) {
return entity[path[path_position]];
}
return this.rawGetPathValue(entity[path[path_position]], path, path_position + 1, path_length);
}
};