after review improvements
[mootools.git] / Source / Types / Object.js
blobdc88f6de3ccec7a0628a10df0fcdaca8323cc6da
1 /*
2 ---
4 name: Object
6 description: Object generic methods
8 license: MIT-style license.
10 requires: Type
12 provides: [Object, Hash]
14 ...
17 (function(){
19 var hasOwnProperty = Object.prototype.hasOwnProperty;
21 Object.extend({
23         subset: function(object, keys){
24                 var results = {};
25                 for (var i = 0, l = keys.length; i < l; i++){
26                         var k = keys[i];
27                         if (k in object) results[k] = object[k];
28                 }
29                 return results;
30         },
32         map: function(object, fn, bind){
33                 var results = {};
34                 var keys = Object.keys(object);
35                 for (var i = 0; i < keys.length; i++){
36                         var key = keys[i];
37                         results[key] = fn.call(bind, object[key], key, object);
38                 }
39                 return results;
40         },
42         filter: function(object, fn, bind){
43                 var results = {};
44                 var keys = Object.keys(object);
45                 for (var i = 0; i < keys.length; i++){
46                         var key = keys[i], value = object[key];
47                         if (fn.call(bind, value, key, object)) results[key] = value;
48                 }
49                 return results;
50         },
52         every: function(object, fn, bind){
53                 var keys = Object.keys(object);
54                 for (var i = 0; i < keys.length; i++){
55                         var key = keys[i];
56                         if (!fn.call(bind, object[key], key)) return false;
57                 }
58                 return true;
59         },
61         some: function(object, fn, bind){
62                 var keys = Object.keys(object);
63                 for (var i = 0; i < keys.length; i++){
64                         var key = keys[i];
65                         if (fn.call(bind, object[key], key)) return true;
66                 }
67                 return false;
68         },
70         values: function(object){
71                 var values = [];
72                 var keys = Object.keys(object);
73                 for (var i = 0; i < keys.length; i++){
74                         var k = keys[i];
75                         values.push(object[k]);
76                 }
77                 return values;
78         },
80         getLength: function(object){
81                 return Object.keys(object).length;
82         },
84         keyOf: function(object, value){
85                 var keys = Object.keys(object);
86                 for (var i = 0; i < keys.length; i++){
87                         var key = keys[i];
88                         if (object[key] === value) return key;
89                 }
90                 return null;
91         },
93         contains: function(object, value){
94                 return Object.keyOf(object, value) != null;
95         },
97         toQueryString: function(object, base){
98                 var queryString = [];
100                 Object.each(object, function(value, key){
101                         if (base) key = base + '[' + key + ']';
102                         var result;
103                         switch (typeOf(value)){
104                                 case 'object': result = Object.toQueryString(value, key); break;
105                                 case 'array':
106                                         var qs = {};
107                                         value.each(function(val, i){
108                                                 qs[i] = val;
109                                         });
110                                         result = Object.toQueryString(qs, key);
111                                 break;
112                                 default: result = key + '=' + encodeURIComponent(value);
113                         }
114                         if (value != null) queryString.push(result);
115                 });
117                 return queryString.join('&');
118         }
122 })();
124 //<1.2compat>
126 Hash.implement({
128         has: Object.prototype.hasOwnProperty,
130         keyOf: function(value){
131                 return Object.keyOf(this, value);
132         },
134         hasValue: function(value){
135                 return Object.contains(this, value);
136         },
138         extend: function(properties){
139                 Hash.each(properties || {}, function(value, key){
140                         Hash.set(this, key, value);
141                 }, this);
142                 return this;
143         },
145         combine: function(properties){
146                 Hash.each(properties || {}, function(value, key){
147                         Hash.include(this, key, value);
148                 }, this);
149                 return this;
150         },
152         erase: function(key){
153                 if (this.hasOwnProperty(key)) delete this[key];
154                 return this;
155         },
157         get: function(key){
158                 return (this.hasOwnProperty(key)) ? this[key] : null;
159         },
161         set: function(key, value){
162                 if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
163                 return this;
164         },
166         empty: function(){
167                 Hash.each(this, function(value, key){
168                         delete this[key];
169                 }, this);
170                 return this;
171         },
173         include: function(key, value){
174                 if (this[key] == null) this[key] = value;
175                 return this;
176         },
178         map: function(fn, bind){
179                 return new Hash(Object.map(this, fn, bind));
180         },
182         filter: function(fn, bind){
183                 return new Hash(Object.filter(this, fn, bind));
184         },
186         every: function(fn, bind){
187                 return Object.every(this, fn, bind);
188         },
190         some: function(fn, bind){
191                 return Object.some(this, fn, bind);
192         },
194         getKeys: function(){
195                 return Object.keys(this);
196         },
198         getValues: function(){
199                 return Object.values(this);
200         },
202         toQueryString: function(base){
203                 return Object.toQueryString(this, base);
204         }
208 Hash.extend = Object.append;
210 Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});
212 //</1.2compat>