Odmiana liczebników w JavaScript

Prosta funkcja w JS do odmiany liczebników. Do tej pory najczęściej korzystałem z wersji PHPowej, ale zaszła konieczność użycia również po stronie klienta…

var num = function (value, numerals, wovalue) {
	var t0 = value % 10,
		t1 = value % 100,
		vo = [];
	if (wovalue !== true)
		vo.push(value);
	if (value === 1 && numerals[1])
		vo.push(numerals[1]);
	else if ((value == 0 || (t0 >= 0 && t0 <= 1) || (t0 >= 5 && t0 <= 9) || (t1 > 10 && t1 < 20)) && numerals[0])
		vo.push(numerals[0]);
	else if (((t1 < 10 || t1 > 20) && t0 >= 2 && t0 <= 4) && numerals[2])
		vo.push(numerals[2]);
	return vo.join(' ');
};

Użycie:

num(wartość, ["zero elementów", "jeden element", "dwa elementy"], [true = pominięcie wartości na wyjściu]);

Albo bardziej w "życiowej" postaci:

num(123, ["osób", "osoba", "osoby"]);==> "123 osoby"

array_unpack

var array_unpack = function (array) {
	if (array instanceof Array && array.length == 2)
		return array_unpack_part(array.shift(), array.shift());
	return false;
};

var array_unpack_part = function (av, ak) {
	var o = {}, a = [], ia = true;
	for (var vi = 0, vl = av.length; vi < vl; vi += 2) {
		var t = av.slice(vi, vi + 2);
		if (t[1] instanceof Array)
			o[ak[t[0]]] = array_unpack_part(t[1], ak);
		else
			o[ak[t[0]]] = ak[t[1]];
	}
	for (var oi in o) {
		if (!isNaN(parseInt(oi)) && isFinite(oi))
			a[oi] = o[oi];
		else
			ia = false;
	}
	return ia ? a : o;
};

array_pack

public static function array_pack ($array, & $vs = null)
{
	$in = $vs === null;
	$as = null;
	foreach ($array as $k => $v)
	{
		if (!isset($vs[$k]))
			$vs[$k] = count($vs);
		
		if (is_array($v))
		{
			$as[] = $vs[$k];
			$as[] = self::array_pack($v, $vs);
		}
		else
		{
			if (!isset($vs[$v]))
				$vs[$v] = count($vs);
			$as[] = $vs[$k];
			$as[] = $vs[$v];
		}
	}
	return $in ? array($as, array_flip($vs)) : $as;
}

Spłaszczenie tablicy wielowymiarowej

Napisana na własne potrzeby jak zwykle, prosta funkcja do zamiany wielowymiarowej tablicy na jej „spłaszczoną” postać.

function array_flat ($array, $key = '')
{
	$output = array();
	if (is_array($array))
	{
		foreach ($array as $k => $v)
			if (is_array($v))
				$output = array_merge($output, array_flat($v, $k . '.'));
			else
				$output[$key . $k] = $v;
	}
	return $output;
}

Reboot

Pora powrócić do pierwotnego zamysłu owego „bloga” z racji tego, że nigdy nie posiadałem umiejętności literackich a i pisanie o pierdołach już mnie jakoś nie kręci. Pora powrócić do pomysłu „pudełka na wycinki” – fragmentów kodów, podpowiedzi, linków do interesujących rozwiązań, tego wszystkiego o czym czasem zapominam a warto mieć do tego prosty dostęp…