# Utiliser les helpers intégrés pour string, number, date et array

> Total.js étend String, Number, Date et Array avec des helpers pour les slugs, les hachages, le formatage, l'analyse, le regroupement et la recherche, et offre U.extend() et U.clone() pour les objets.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: fr
Content-SHA256: d7065c378e8b6704e07c1a0f027dacf41cb7430560de0a1324ce107693d92069
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Total.js ajoute un ensemble de méthodes aux types intégrés de JavaScript. Elles sont disponibles partout dans l'application, il vaut donc la peine de les connaître avant d'écrire votre propre helper. Celles ci-dessous sont exercées par l'exemple.

**String :** `slug([max])` crée un texte adapté aux URL (minuscules, sans accents ni symboles) ; `format(a, b)` remplace `{0}`, `{1}` ; `encode()` / `decode()` échappent et restaurent le HTML ; `padLeft(length, char)` / `padRight()` ; `parseInt2()` et `parseFloat2()` lisent un nombre dans un texte et renvoient `0` s'il n'y en a pas ; `isEmail()`, `isURL()` et `isJSON()` valident ; `parseJSON()` analyse le JSON et renvoie `null` en cas d'erreur ; `md5()`, `sha1()` et `sha256()` renvoient des hachages hexadécimaux ; `capitalize()` met en majuscule la première lettre de chaque mot.

**Number :** `format(decimals, thousands, decimal)`, par exemple `(1234567.891).format(2)` donne `1 234 567.89`.

**Date :** `format('yyyy-MM-dd HH:mm')`, `add('1 day')` et `diff(date, 'days')`.

**Array :** `take(n)` et `skip(n)`, `first()` et `last()`, `trim()` (nettoie les textes et supprime les vides), `findItem(field, value)` et `findIndex(field, value)`, `remove(value)` (supprime chaque occurrence et renvoie le tableau), `group(field)` (renvoie `[{ name, items }]`) et `quicksort(field)`.

**Objets :** `U.extend(target, source)` fusionne `source` dans `target` et le renvoie ; `U.clone(object)` fait une copie profonde.

```js controllers/utilities.js
exports.install = function() {
	ROUTE('GET /utils/', utils);
};

function utils($) {

	var items = [{ type: 'a', n: 1 }, { type: 'b', n: 2 }, { type: 'a', n: 3 }];
	var original = { a: { b: 1 } };
	var copy = U.clone(original);
	copy.a.b = 2;

	$.json({
		slug: 'Hello Wörld & Co!'.slug(),
		slugmax: 'Hello brave new world'.slug(11),
		format: '{0} has {1} items'.format('Ann', 3),
		encode: '<a href="x">&</a>'.encode(),
		decode: '&lt;b&gt;'.decode(),
		pad: ['7'.padLeft(3, '0'), '7'.padRight(3, '0')],
		numbers: ['abc12x'.parseInt2(), '3,5kg'.parseFloat2(), 'none'.parseInt2()],
		is: ['a@b.cz'.isEmail(), 'nope'.isEmail(), 'https://totaljs.com'.isURL(), '{"a":1}'.isJSON(), 'abc'.isJSON()],
		json: ['{"a":1}'.parseJSON(), 'not json'.parseJSON()],
		md5: 'abc'.md5(),
		sha1: 'abc'.sha1(),
		capitalize: 'hello big world'.capitalize(),
		number: [(1234567.891).format(2), (1234567.891).format(2, ' ', ',')],
		date: [new Date(2026, 0, 5, 9, 7).format('yyyy-MM-dd HH:mm'), new Date(2026, 0, 31).add('1 day').format('yyyy-MM-dd'), new Date(2026, 0, 5).diff(new Date(2026, 0, 1), 'days')],
		take: [[1, 2, 3, 4, 5].take(2), [1, 2, 3, 4, 5].skip(3), [1, 2, 3].first(), [1, 2, 3].last()],
		trim: ['a', '', ' b '].trim(),
		find: [[{ id: 1 }, { id: 2 }].findItem('id', 2), [{ id: 1 }, { id: 2 }].findIndex('id', 2)],
		remove: [1, 2, 3, 2].remove(2),
		group: items.group('type'),
		sort: [{ n: 'b' }, { n: 'a' }].quicksort('n'),
		extend: U.extend({ a: 1 }, { b: 2 }),
		clone: [original.a.b, copy.a.b]
	});
}
```
