-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharr.js
More file actions
340 lines (258 loc) · 8.41 KB
/
arr.js
File metadata and controls
340 lines (258 loc) · 8.41 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
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
/*
* This file is part of the QuidPHP package <https://quidphp.com>
* Author: Pierre-Philippe Emond <emondpph@gmail.com>
* License: https://github.com/quidphp/javascript/blob/master/LICENSE
*/
// arr
// script with some objects related to array manipulation
// import
import { Arr, ArrLike, Func, Integer, Num, Pojo, Str, Vari } from '../index.js';
// arrBase
// fonctions relatives à la lecture de tableau
const ArrBase = {
// is
// retourne vrai si la valeur est un tableau
is: function(value)
{
return Array.isArray(value);
},
// in
// retourne vrai si la valeur est dans le tableau
// retourne un boolean
in: function(value,array)
{
return (this.is(array))? Array.prototype.includes.call(array,value):null;
},
// keys
// retourne un tableau avec clés du présent tableau
keys: function(array)
{
this.typecheck(array);
return Array.from(Array.prototype.keys.call(array));
},
// valueFirst
// retourne le première valeur dans le tableau
valueFirst: function(array)
{
this.typecheck(array);
return (array.length)? array[0]:undefined;
},
// valueLast
// retourne la dernière valeur dans le tableau
valueLast: function(array)
{
this.typecheck(array);
return (array.length)? array[array.length-1]:undefined;
},
// keyFirst
// retourne la première clé d'un tableau
keyFirst: function(array)
{
this.typecheck(array);
return (array.length)? 0:undefined;
},
// keyLast
// retourne la dernière clé d'un tableau
keyLast: function(array)
{
this.typecheck(array);
return (array.length)? array.length-1:undefined;
},
// search
// retourne l'index de la valeur dans le tableau
search: function(value,array)
{
let r = null;
this.typecheck(array);
r = Array.prototype.indexOf.call(array,value);
r = (r === -1)? null:r;
return r;
},
// slice
// fait un slice sur un tableau avec un start et un end
slice: function(start,end,array)
{
let r = null;
this.typecheck(array);
start = Integer.is(start)? start:0;
end = Integer.is(end)? end:undefined;
r = Array.prototype.slice.call(array,start,end);
return r;
},
// sliceStart
// fait un slice à partir du début d'un tableau
sliceStart: function(start,array)
{
return this.slice(start,true,array);
},
// merge
// retourne un nouveau tableau avec le contenu de tous les tableaux merged (concat)
merge: function(array)
{
let r = null;
this.typecheck(array);
const args = ArrLike.sliceStart(1,arguments);
r = Array.prototype.concat.apply(array,args);
return r;
},
// clean
// retourne un nouveau tableau avec les valeurs vides retirés
clean: function(array)
{
return this.filter(array,function(ele) {
return Vari.isNotReallyEmpty(ele);
});
},
// valueStrip
// permet de retourner un nouveau tableau sans la valeur donné en argument
valueStrip: function(value,array)
{
return this.filter(array,function(v) {
return (v === value)? false:true;
});
},
// find
// retourne la première valeur de l'objet dont le callback retourne true, utilise la méthode du prototype
find: function(array,callback) {
this.typecheck(array);
Func.typecheck(callback);
return Array.prototype.find.call(array,callback);
},
// some
// vérifie qu'au moins une entrée du tableau passe le test de la fonction anonyme
some: function(array,callback)
{
this.typecheck(array);
Func.typecheck(callback);
return Array.prototype.some.call(array,callback);
},
// every
// vérifie que toutes les entrée du tableau passe le test de la fonction anonyme
every: function(array,callback)
{
this.typecheck(array);
Func.typecheck(callback);
return Array.prototype.every.call(array,callback);
},
// map
// permet de créer un nouvel objet avec les valeurs changés selon la fonction de rappel, utilise la méthode du prototype
map: function(array,callback)
{
this.typecheck(array);
Func.typecheck(callback);
return Array.prototype.map.call(array,callback);
},
// filter
// permet de créer un nouvel objet avec seulement les entrées qui retournent true, utilise la méthode du prototype
filter: function(array,callback)
{
this.typecheck(array);
Func.typecheck(callback);
return Array.prototype.filter.call(array,callback);
},
// reduce
// retourne une valeur simple à partir d'un tableau
// changement de l'ordre des arguments, de même la clé est envoyé au callback en troisième argument
reduce: function(r,array,callback)
{
this.typecheck(array);
Func.typecheck(callback);
return Array.prototype.reduce.call(array,callback,r);
},
// column
// retourne un tableau avec une seule propriété de chaque pojo dans le tableau
column: function(prop,array)
{
const r = [];
Str.typecheck(prop,true);
this.each(array,function(value) {
if(Pojo.is(value) && Pojo.keyExists(prop,value))
r.push(value[prop]);
});
return r;
},
// new
// retourne la cible pour la copie
new: function()
{
return [];
}
}
// arrWriteSelf
// fonctions relatives à l'écriture sur des tableaux (en référence)
const ArrWriteSelf = {
// mergeRef
// permet de fusionner plusieurs tableaux dans le premier tableau
// le premier tableau est modifié
mergeRef: function(array)
{
this.typecheck(array);
let r = array;
const inst = this;
const args = ArrLike.sliceStart(1,arguments);
this.each(args,function(value) {
if(!Arr.is(value))
value = [value];
Array.prototype.push.apply(r,value);
});
return r;
},
// reverseRef
// permet de renverser le tableau courant
reverseRef: function(array)
{
this.typecheck(array);
return array.reverse();
},
// spliceValue
// permet de retourner le même tableau sans la valeur donné en argument
// retourne la valeur splice
spliceValue: function(value,array,replace)
{
let r = null;
let index = this.search(value,array);
this.typecheck(array);
let args = [index,1];
if(typeof(replace) !== 'undefined')
args.push(replace);
r = Array.prototype.splice.apply(array,args);
return r;
}
}
// arrLoop
// fonctions relatives à certains loops spéciaux
const ArrLoop = {
// timeouts
// permet de lancer un callback sur chaque element du tableau avec timeout différent (selon index)
timeouts: function(array,timeout,indexTimeout,callback)
{
Integer.typecheck(timeout);
Integer.typecheck(indexTimeout);
Func.typecheck(callback);
return Arr.each(array,function(value, index) {
const funcTimeout = timeout + (index * indexTimeout);
const funcWrap = function() {
callback(value,index,funcTimeout);
}
Func.timeout(funcTimeout,funcWrap);
});
},
// oddEven
// permet d'appeler une méthode de callback différents selon si l'élément est odd ou even
oddEven: function(array,funcOdd,funcEven)
{
Func.typechecks([funcOdd,funcEven],false);
return Arr.each(array,function(value,index) {
const key = index + 1;
if(Num.isOdd(key))
{
if(funcOdd != null)
funcOdd(value,index)
}
else if(funcEven != null)
funcEven(value,index);
});
}
}
// export
export { ArrBase, ArrWriteSelf, ArrLoop };