@rogolev/value 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +142 -1
- package/docs/helpers/array/array_chunk.md +80 -0
- package/docs/helpers/array/array_chunk_with_keys.md +81 -0
- package/docs/helpers/array/array_column.md +110 -0
- package/docs/helpers/array/array_combine.md +77 -0
- package/docs/helpers/array/array_count_values.md +71 -0
- package/docs/helpers/array/array_diff.md +97 -0
- package/docs/helpers/array/array_diff_assoc.md +81 -0
- package/docs/helpers/array/array_diff_key.md +81 -0
- package/docs/helpers/array/array_diff_uassoc.md +101 -0
- package/docs/helpers/array/array_diff_ukey.md +101 -0
- package/docs/helpers/array/array_fill.md +81 -0
- package/docs/helpers/array/array_fill_keys.md +73 -0
- package/docs/helpers/array/array_filter.md +79 -0
- package/docs/helpers/array/array_flip.md +70 -0
- package/docs/helpers/array/array_index_max.md +78 -0
- package/docs/helpers/array/array_index_min.md +78 -0
- package/docs/helpers/array/array_intersect.md +91 -0
- package/docs/helpers/array/array_intersect_assoc.md +91 -0
- package/docs/helpers/array/array_intersect_key.md +91 -0
- package/docs/helpers/array/array_intersect_uassoc.md +101 -0
- package/docs/helpers/array/array_intersect_ukey.md +101 -0
- package/docs/helpers/array/array_key_exists.md +73 -0
- package/docs/helpers/array/array_key_first.md +62 -0
- package/docs/helpers/array/array_key_last.md +62 -0
- package/docs/helpers/array/array_key_to_lower_case.md +57 -0
- package/docs/helpers/array/array_key_to_upper_case.md +57 -0
- package/docs/helpers/array/array_keys.md +62 -0
- package/docs/helpers/array/array_map.md +69 -0
- package/docs/helpers/array/array_merge.md +67 -0
- package/docs/helpers/array/array_merge_recursive.md +86 -0
- package/docs/helpers/array/array_pad.md +83 -0
- package/docs/helpers/array/array_pop.md +64 -0
- package/docs/helpers/array/array_product.md +62 -0
- package/docs/helpers/array/array_push.md +57 -0
- package/docs/helpers/array/array_rand.md +99 -0
- package/docs/helpers/array/array_reduce.md +77 -0
- package/docs/helpers/array/array_replace.md +85 -0
- package/docs/helpers/array/array_replace_recursive.md +87 -0
- package/docs/helpers/array/array_reverse.md +55 -0
- package/docs/helpers/array/array_search.md +74 -0
- package/docs/helpers/array/array_shift.md +64 -0
- package/docs/helpers/array/array_slice.md +65 -0
- package/docs/helpers/array/array_splice.md +103 -0
- package/docs/helpers/array/array_sum.md +55 -0
- package/docs/helpers/array/array_udiff.md +97 -0
- package/docs/helpers/array/array_udiff_assoc.md +101 -0
- package/docs/helpers/array/array_udiff_uassoc.md +88 -0
- package/docs/helpers/array/array_uintersect.md +101 -0
- package/docs/helpers/array/array_uintersect_assoc.md +102 -0
- package/docs/helpers/array/array_uintersect_uassoc.md +135 -0
- package/docs/helpers/array/array_unique.md +54 -0
- package/docs/helpers/array/array_unshift.md +58 -0
- package/docs/helpers/array/array_values.md +54 -0
- package/docs/helpers/array/array_walk.md +87 -0
- package/docs/helpers/array/array_walk_recursive.md +93 -0
- package/docs/helpers/array/count.md +54 -0
- package/docs/helpers/array/in_array.md +65 -0
- package/docs/helpers/array/natsort.md +60 -0
- package/docs/helpers/array/range.md +76 -0
- package/docs/helpers/array/shuffle.md +74 -0
- package/docs/helpers/array/sort.md +79 -0
- package/docs/helpers/is_char.md +84 -0
- package/docs/helpers/string/is_digit_char.md +70 -0
- package/docs/helpers/string/is_whitespace_char.md +70 -0
- package/docs/helpers/string/natcompare.md +69 -0
- package/docs/helpers/string/natcompare_numeric.md +70 -0
- package/docs/helpers.md +125 -1
- package/index.mjs +66 -1
- package/package.json +2 -1
- package/prettier.config.mjs +2 -1
- package/src/helpers/array/array_chunk.mjs +102 -0
- package/src/helpers/array/array_chunk_with_keys.mjs +102 -0
- package/src/helpers/array/array_column.mjs +131 -0
- package/src/helpers/array/array_combine.mjs +26 -0
- package/src/helpers/array/array_count_values.mjs +82 -0
- package/src/helpers/array/array_diff.mjs +77 -0
- package/src/helpers/array/array_diff_assoc.mjs +56 -0
- package/src/helpers/array/array_diff_key.mjs +56 -0
- package/src/helpers/array/array_diff_uassoc.mjs +76 -0
- package/src/helpers/array/array_diff_ukey.mjs +71 -0
- package/src/helpers/array/array_fill.mjs +108 -0
- package/src/helpers/array/array_fill_keys.mjs +90 -0
- package/src/helpers/array/array_filter.mjs +105 -0
- package/src/helpers/array/array_flip.mjs +58 -0
- package/src/helpers/array/array_index_max.mjs +82 -0
- package/src/helpers/array/array_index_min.mjs +82 -0
- package/src/helpers/array/array_intersect.mjs +71 -0
- package/src/helpers/array/array_intersect_assoc.mjs +67 -0
- package/src/helpers/array/array_intersect_key.mjs +67 -0
- package/src/helpers/array/array_intersect_uassoc.mjs +77 -0
- package/src/helpers/array/array_intersect_ukey.mjs +72 -0
- package/src/helpers/array/array_key_exists.mjs +83 -0
- package/src/helpers/array/array_key_first.mjs +73 -0
- package/src/helpers/array/array_key_last.mjs +74 -0
- package/src/helpers/array/array_key_to_lower_case.mjs +71 -0
- package/src/helpers/array/array_key_to_upper_case.mjs +71 -0
- package/src/helpers/array/array_keys.mjs +65 -0
- package/src/helpers/array/array_map.mjs +84 -0
- package/src/helpers/array/array_merge.mjs +95 -0
- package/src/helpers/array/array_merge_recursive.mjs +153 -0
- package/src/helpers/array/array_pad.mjs +105 -0
- package/src/helpers/array/array_pop.mjs +82 -0
- package/src/helpers/array/array_product.mjs +67 -0
- package/src/helpers/array/array_push.mjs +75 -0
- package/src/helpers/array/array_rand.mjs +129 -0
- package/src/helpers/array/array_reduce.mjs +90 -0
- package/src/helpers/array/array_replace.mjs +25 -0
- package/src/helpers/array/array_replace_recursive.mjs +109 -0
- package/src/helpers/array/array_reverse.mjs +62 -0
- package/src/helpers/array/array_search.mjs +104 -0
- package/src/helpers/array/array_shift.mjs +78 -0
- package/src/helpers/array/array_slice.mjs +99 -0
- package/src/helpers/array/array_splice.mjs +218 -0
- package/src/helpers/array/array_sum.mjs +60 -0
- package/src/helpers/array/array_udiff.mjs +91 -0
- package/src/helpers/array/array_udiff_assoc.mjs +71 -0
- package/src/helpers/array/array_udiff_uassoc.mjs +124 -0
- package/src/helpers/array/array_uintersect.mjs +72 -0
- package/src/helpers/array/array_uintersect_assoc.mjs +77 -0
- package/src/helpers/array/array_uintersect_uassoc.mjs +121 -0
- package/src/helpers/array/array_unique.mjs +77 -0
- package/src/helpers/array/array_unshift.mjs +64 -0
- package/src/helpers/array/array_values.mjs +57 -0
- package/src/helpers/array/array_walk.mjs +95 -0
- package/src/helpers/array/array_walk_recursive.mjs +104 -0
- package/src/helpers/array/count.mjs +57 -0
- package/src/helpers/array/in_array.mjs +67 -0
- package/src/helpers/array/natsort.mjs +62 -0
- package/src/helpers/array/range.mjs +121 -0
- package/src/helpers/array/shuffle.mjs +73 -0
- package/src/helpers/array/sort.mjs +69 -0
- package/src/helpers/is_char.mjs +54 -0
- package/src/helpers/string/is_digit_char.mjs +60 -0
- package/src/helpers/string/is_whitespace_char.mjs +54 -0
- package/src/helpers/string/natcompare.mjs +107 -0
- package/src/helpers/string/natcompare_numeric.mjs +131 -0
- package/tests/helpers/array/array_chunk.test.mjs +49 -0
- package/tests/helpers/array/array_chunk_with_keys.test.mjs +45 -0
- package/tests/helpers/array/array_column.test.mjs +87 -0
- package/tests/helpers/array/array_combine.test.mjs +41 -0
- package/tests/helpers/array/array_count_values.test.mjs +40 -0
- package/tests/helpers/array/array_diff.test.mjs +78 -0
- package/tests/helpers/array/array_diff_assoc.test.mjs +64 -0
- package/tests/helpers/array/array_diff_key.test.mjs +64 -0
- package/tests/helpers/array/array_diff_uassoc.test.mjs +73 -0
- package/tests/helpers/array/array_diff_ukey.test.mjs +77 -0
- package/tests/helpers/array/array_fill.test.mjs +47 -0
- package/tests/helpers/array/array_fill_keys.test.mjs +35 -0
- package/tests/helpers/array/array_filter.test.mjs +38 -0
- package/tests/helpers/array/array_flip.test.mjs +33 -0
- package/tests/helpers/array/array_index_max.test.mjs +41 -0
- package/tests/helpers/array/array_index_min.test.mjs +41 -0
- package/tests/helpers/array/array_intersect.test.mjs +65 -0
- package/tests/helpers/array/array_intersect_assoc.test.mjs +65 -0
- package/tests/helpers/array/array_intersect_key.test.mjs +65 -0
- package/tests/helpers/array/array_intersect_uassoc.test.mjs +76 -0
- package/tests/helpers/array/array_intersect_ukey.test.mjs +74 -0
- package/tests/helpers/array/array_key_exists.test.mjs +36 -0
- package/tests/helpers/array/array_key_first.test.mjs +29 -0
- package/tests/helpers/array/array_key_last.test.mjs +29 -0
- package/tests/helpers/array/array_key_to_lower_case.test.mjs +23 -0
- package/tests/helpers/array/array_key_to_upper_case.test.mjs +23 -0
- package/tests/helpers/array/array_keys.test.mjs +27 -0
- package/tests/helpers/array/array_map.test.mjs +32 -0
- package/tests/helpers/array/array_merge.test.mjs +37 -0
- package/tests/helpers/array/array_merge_recursive.test.mjs +65 -0
- package/tests/helpers/array/array_pad.test.mjs +48 -0
- package/tests/helpers/array/array_pop.test.mjs +29 -0
- package/tests/helpers/array/array_product.test.mjs +33 -0
- package/tests/helpers/array/array_push.test.mjs +31 -0
- package/tests/helpers/array/array_rand.test.mjs +59 -0
- package/tests/helpers/array/array_reduce.test.mjs +44 -0
- package/tests/helpers/array/array_replace.test.mjs +46 -0
- package/tests/helpers/array/array_replace_recursive.test.mjs +46 -0
- package/tests/helpers/array/array_reverse.test.mjs +31 -0
- package/tests/helpers/array/array_search.test.mjs +48 -0
- package/tests/helpers/array/array_shift.test.mjs +29 -0
- package/tests/helpers/array/array_slice.test.mjs +49 -0
- package/tests/helpers/array/array_splice.test.mjs +67 -0
- package/tests/helpers/array/array_sum.test.mjs +27 -0
- package/tests/helpers/array/array_udiff.test.mjs +95 -0
- package/tests/helpers/array/array_udiff_assoc.test.mjs +77 -0
- package/tests/helpers/array/array_udiff_uassoc.test.mjs +89 -0
- package/tests/helpers/array/array_uintersect.test.mjs +78 -0
- package/tests/helpers/array/array_uintersect_assoc.test.mjs +80 -0
- package/tests/helpers/array/array_uintersect_uassoc.test.mjs +122 -0
- package/tests/helpers/array/array_unique.test.mjs +27 -0
- package/tests/helpers/array/array_unshift.test.mjs +31 -0
- package/tests/helpers/array/array_values.test.mjs +27 -0
- package/tests/helpers/array/array_walk.test.mjs +48 -0
- package/tests/helpers/array/array_walk_recursive.test.mjs +53 -0
- package/tests/helpers/array/count.test.mjs +27 -0
- package/tests/helpers/array/in_array.test.mjs +52 -0
- package/tests/helpers/array/natsort.test.mjs +71 -0
- package/tests/helpers/array/range.test.mjs +51 -0
- package/tests/helpers/array/shuffle.test.mjs +42 -0
- package/tests/helpers/array/sort.test.mjs +60 -0
- package/tests/helpers/is_char.test.mjs +40 -0
- package/tests/helpers/string/is_digit_char.test.mjs +32 -0
- package/tests/helpers/string/is_whitespace_char.test.mjs +32 -0
- package/tests/helpers/string/natcompare.test.mjs +100 -0
- package/tests/helpers/string/natcompare_numeric.test.mjs +110 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import is_string from '../is_string.mjs';
|
|
2
|
+
import is_digit_char from './is_digit_char.mjs';
|
|
3
|
+
import is_whitespace_char from './is_whitespace_char.mjs';
|
|
4
|
+
import natcompare_numeric from './natcompare_numeric.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Сравнивает две строки в естественном порядке.
|
|
8
|
+
*
|
|
9
|
+
* ### Описание
|
|
10
|
+
*
|
|
11
|
+
* Функция `natcompare` используется для сравнения двух строк в естественном порядке.
|
|
12
|
+
* Она поддерживает строки с ведущими нулями и пробелами и игнорирует их при сравнении.
|
|
13
|
+
*
|
|
14
|
+
* ### Параметры
|
|
15
|
+
*
|
|
16
|
+
* - `a` (string): Первая строка для сравнения.
|
|
17
|
+
* - `b` (string): Вторая строка для сравнения.
|
|
18
|
+
*
|
|
19
|
+
* ### Возвращаемое значение
|
|
20
|
+
*
|
|
21
|
+
* Возвращает отрицательное значение, если `a` меньше `b`, ноль, если `a` равно `b`, и положительное значение, если `a` больше `b`.
|
|
22
|
+
*
|
|
23
|
+
* ### Примеры использования
|
|
24
|
+
*
|
|
25
|
+
* 1. Сравнение строк с числовыми значениями:
|
|
26
|
+
*
|
|
27
|
+
* ```js
|
|
28
|
+
* const result = natcompare('10', '2');
|
|
29
|
+
* console.log(result); // 1
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* 2. Сравнение строк с ведущими нулями:
|
|
33
|
+
*
|
|
34
|
+
* ```js
|
|
35
|
+
* const result = natcompare('0010', '10');
|
|
36
|
+
* console.log(result); // 0
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @param {string} a Первая строка для сравнения.
|
|
40
|
+
* @param {string} b Вторая строка для сравнения.
|
|
41
|
+
* @returns {number} Возвращает отрицательное значение, если `a` меньше `b`, ноль, если `a` равно `b`, и положительное значение, если `a` больше `b`.
|
|
42
|
+
* @throws {TypeError} Если параметры не являются строками.
|
|
43
|
+
*/
|
|
44
|
+
export default function natcompare(a, b) {
|
|
45
|
+
if (!is_string(a)) {
|
|
46
|
+
throw new TypeError('Параметр "a" должен быть строкой.');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (!is_string(b)) {
|
|
50
|
+
throw new TypeError('Параметр "b" должен быть строкой.');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
a = a.trim();
|
|
54
|
+
b = b.trim();
|
|
55
|
+
|
|
56
|
+
let ia = 0;
|
|
57
|
+
let ib = 0;
|
|
58
|
+
let nza = 0;
|
|
59
|
+
let nzb = 0;
|
|
60
|
+
|
|
61
|
+
while (true) {
|
|
62
|
+
nza = 0;
|
|
63
|
+
nzb = 0;
|
|
64
|
+
|
|
65
|
+
let ca = a.charAt(ia);
|
|
66
|
+
let cb = b.charAt(ib);
|
|
67
|
+
|
|
68
|
+
while (is_whitespace_char(ca) || ca === '0') {
|
|
69
|
+
if (ca === '0') {
|
|
70
|
+
nza++;
|
|
71
|
+
} else {
|
|
72
|
+
nza = 0;
|
|
73
|
+
}
|
|
74
|
+
ca = a.charAt(++ia);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
while (is_whitespace_char(cb) || cb === '0') {
|
|
78
|
+
if (cb === '0') {
|
|
79
|
+
nzb++;
|
|
80
|
+
} else {
|
|
81
|
+
nzb = 0;
|
|
82
|
+
}
|
|
83
|
+
cb = b.charAt(++ib);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (is_digit_char(ca) && is_digit_char(cb)) {
|
|
87
|
+
const result = natcompare_numeric(a.slice(ia), b.slice(ib));
|
|
88
|
+
|
|
89
|
+
if (result !== 0) {
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (ca === '' && cb === '') {
|
|
95
|
+
return nza - nzb;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (ca < cb) {
|
|
99
|
+
return -1;
|
|
100
|
+
} else if (ca > cb) {
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
ia++;
|
|
105
|
+
ib++;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import is_string from '../is_string.mjs';
|
|
2
|
+
import is_digit_char from './is_digit_char.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Сравнивает две строки, содержащие числовые значения, в естественном порядке.
|
|
6
|
+
*
|
|
7
|
+
* ### Описание
|
|
8
|
+
*
|
|
9
|
+
* Функция `natcompare_numeric` используется для сравнения двух строк, содержащих числовые значения, в естественном порядке.
|
|
10
|
+
* Она поддерживает строки с ведущими нулями и игнорирует их при сравнении.
|
|
11
|
+
*
|
|
12
|
+
* ### Параметры
|
|
13
|
+
*
|
|
14
|
+
* - `a` (string): Первая строка для сравнения.
|
|
15
|
+
* - `b` (string): Вторая строка для сравнения.
|
|
16
|
+
*
|
|
17
|
+
* ### Возвращаемое значение
|
|
18
|
+
*
|
|
19
|
+
* Возвращает отрицательное значение, если `a` меньше `b`, ноль, если `a` равно `b`, и положительное значение, если `a` больше `b`.
|
|
20
|
+
*
|
|
21
|
+
* ### Примеры использования
|
|
22
|
+
*
|
|
23
|
+
* 1. Сравнение строк с числовыми значениями:
|
|
24
|
+
*
|
|
25
|
+
* ```js
|
|
26
|
+
* const result = natcompare_numeric('10', '2');
|
|
27
|
+
* console.log(result); // 1
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* 2. Сравнение строк с ведущими нулями:
|
|
31
|
+
*
|
|
32
|
+
* ```js
|
|
33
|
+
* const result = natcompare_numeric('0010', '10');
|
|
34
|
+
* console.log(result); // 0
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* 3. Сравнение строк с пробелами:
|
|
38
|
+
*
|
|
39
|
+
* ```js
|
|
40
|
+
* const result = natcompare_numeric(' 10', '10');
|
|
41
|
+
* console.log(result); // 0
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* 4. Сравнение строк с буквами и числами:
|
|
45
|
+
*
|
|
46
|
+
* ```js
|
|
47
|
+
* const result = natcompare_numeric('a10', 'a2');
|
|
48
|
+
* console.log(result); // 1
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* 5. Сравнение строк с разными символами:
|
|
52
|
+
*
|
|
53
|
+
* ```js
|
|
54
|
+
* const result = natcompare_numeric('10-', '10+');
|
|
55
|
+
* console.log(result); // 0
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @param {string} a Первая строка для сравнения.
|
|
59
|
+
* @param {string} b Вторая строка для сравнения.
|
|
60
|
+
* @returns {number} Возвращает отрицательное значение, если `a` меньше `b`, ноль, если `a` равно `b`, и положительное значение, если `a` больше `b`.
|
|
61
|
+
* @throws {TypeError} Если параметры не являются строками.
|
|
62
|
+
*/
|
|
63
|
+
export default function natcompare_numeric(a, b) {
|
|
64
|
+
if (!is_string(a)) {
|
|
65
|
+
throw new TypeError('Параметр "a" должен быть строкой.');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (!is_string(b)) {
|
|
69
|
+
throw new TypeError('Параметр "b" должен быть строкой.');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
a = a.trim();
|
|
73
|
+
b = b.trim();
|
|
74
|
+
|
|
75
|
+
let result = 0;
|
|
76
|
+
|
|
77
|
+
let ia = 0;
|
|
78
|
+
let ib = 0;
|
|
79
|
+
|
|
80
|
+
// Пропускаем ведущие нули
|
|
81
|
+
while (ia < a.length && a[ia] === '0') {
|
|
82
|
+
ia++;
|
|
83
|
+
}
|
|
84
|
+
while (ib < b.length && b[ib] === '0') {
|
|
85
|
+
ib++;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Сравниваем оставшиеся части строк
|
|
89
|
+
while (ia < a.length && ib < b.length) {
|
|
90
|
+
const ca = a[ia];
|
|
91
|
+
const cb = b[ib];
|
|
92
|
+
|
|
93
|
+
if (!is_digit_char(ca) && !is_digit_char(cb)) {
|
|
94
|
+
ia++;
|
|
95
|
+
ib++;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!is_digit_char(ca)) {
|
|
100
|
+
ia++;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (!is_digit_char(cb)) {
|
|
105
|
+
ib++;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (ca < cb) {
|
|
110
|
+
if (result === 0) {
|
|
111
|
+
result = -1;
|
|
112
|
+
}
|
|
113
|
+
} else if (ca > cb) {
|
|
114
|
+
if (result === 0) {
|
|
115
|
+
result = 1;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
ia++;
|
|
120
|
+
ib++;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Если одна строка длиннее другой, она считается больше
|
|
124
|
+
if (ia < a.length) {
|
|
125
|
+
return 1;
|
|
126
|
+
} else if (ib < b.length) {
|
|
127
|
+
return -1;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { expect, test, describe } from '@jest/globals';
|
|
2
|
+
import { array_chunk } from '../../../index.mjs';
|
|
3
|
+
|
|
4
|
+
describe('Функция array_chunk', () => {
|
|
5
|
+
test('Должна разбивать массив на части указанной длины', () => {
|
|
6
|
+
const array = [1, 2, 3, 4, 5];
|
|
7
|
+
const result = array_chunk(array, 2);
|
|
8
|
+
expect(result).toEqual([[1, 2], [3, 4], [5]]);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test('Должна возвращать пустой массив, если передан пустой массив', () => {
|
|
12
|
+
const array = [];
|
|
13
|
+
const result = array_chunk(array, 2);
|
|
14
|
+
expect(result).toEqual([]);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('Должна разбивать ассоциативный массив на части указанной длины', () => {
|
|
18
|
+
const assoc = {
|
|
19
|
+
key1: 'value1',
|
|
20
|
+
key2: 'value2',
|
|
21
|
+
key3: 'value3',
|
|
22
|
+
key4: 'value4',
|
|
23
|
+
key5: 'value5',
|
|
24
|
+
};
|
|
25
|
+
const result = array_chunk(assoc, 2);
|
|
26
|
+
expect(result).toEqual([['value1', 'value2'], ['value3', 'value4'], ['value5']]);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('Должна выбрасывать ошибку, если переданное значение не является массивом', () => {
|
|
30
|
+
expect(() => array_chunk('not an array', 2)).toThrow(TypeError);
|
|
31
|
+
expect(() => array_chunk('not an array', 2)).toThrow(
|
|
32
|
+
'Параметр "value" должен быть массивом.',
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('Должна выбрасывать ошибку, если длина не является целым числом', () => {
|
|
37
|
+
const array = [1, 2, 3];
|
|
38
|
+
expect(() => array_chunk(array, 'not an integer')).toThrow(TypeError);
|
|
39
|
+
expect(() => array_chunk(array, 'not an integer')).toThrow(
|
|
40
|
+
'Параметр "length" должен быть целым числом.',
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('Должна выбрасывать ошибку, если длина меньше 1', () => {
|
|
45
|
+
const array = [1, 2, 3];
|
|
46
|
+
expect(() => array_chunk(array, 0)).toThrow(Error);
|
|
47
|
+
expect(() => array_chunk(array, 0)).toThrow('Параметр "length" должен быть больше нуля.');
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { expect, test, describe } from '@jest/globals';
|
|
2
|
+
import { array_chunk_with_keys } from '../../../index.mjs';
|
|
3
|
+
|
|
4
|
+
describe('Функция array_chunk_with_keys', () => {
|
|
5
|
+
test('Должна разбивать ассоциативный массив на части указанной длины с сохранением ключей', () => {
|
|
6
|
+
const assoc = { a: 1, b: 2, c: 3, d: 4, e: 5 };
|
|
7
|
+
const result = array_chunk_with_keys(assoc, 2);
|
|
8
|
+
expect(result).toEqual([{ a: 1, b: 2 }, { c: 3, d: 4 }, { e: 5 }]);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test('Должна возвращать пустой массив, если передан пустой ассоциативный массив', () => {
|
|
12
|
+
const assoc = {};
|
|
13
|
+
const result = array_chunk_with_keys(assoc, 2);
|
|
14
|
+
expect(result).toEqual([]);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('Должна разбивать обычный массив на части указанной длины с сохранением ключей', () => {
|
|
18
|
+
const array = [1, 2, 3, 4, 5];
|
|
19
|
+
const result = array_chunk_with_keys(array, 2);
|
|
20
|
+
expect(result).toEqual([{ 0: 1, 1: 2 }, { 2: 3, 3: 4 }, { 4: 5 }]);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('Должна выбрасывать ошибку, если переданное значение не является массивом', () => {
|
|
24
|
+
expect(() => array_chunk_with_keys('not an array', 2)).toThrow(TypeError);
|
|
25
|
+
expect(() => array_chunk_with_keys('not an array', 2)).toThrow(
|
|
26
|
+
'Параметр "value" должен быть массивом.',
|
|
27
|
+
);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('Должна выбрасывать ошибку, если длина не является целым числом', () => {
|
|
31
|
+
const assoc = { a: 1, b: 2, c: 3 };
|
|
32
|
+
expect(() => array_chunk_with_keys(assoc, 'not an integer')).toThrow(TypeError);
|
|
33
|
+
expect(() => array_chunk_with_keys(assoc, 'not an integer')).toThrow(
|
|
34
|
+
'Параметр "length" должен быть целым числом.',
|
|
35
|
+
);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('Должна выбрасывать ошибку, если длина меньше 1', () => {
|
|
39
|
+
const assoc = { a: 1, b: 2, c: 3 };
|
|
40
|
+
expect(() => array_chunk_with_keys(assoc, 0)).toThrow(Error);
|
|
41
|
+
expect(() => array_chunk_with_keys(assoc, 0)).toThrow(
|
|
42
|
+
'Параметр "length" должен быть больше нуля.',
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { expect, test, describe } from '@jest/globals';
|
|
2
|
+
import { array_column } from '../../../index.mjs';
|
|
3
|
+
|
|
4
|
+
describe('Функция array_column', () => {
|
|
5
|
+
test('Должна извлекать значения указанного столбца из массива объектов', () => {
|
|
6
|
+
const array = [
|
|
7
|
+
{ id: 1, name: 'Alice' },
|
|
8
|
+
{ id: 2, name: 'Bob' },
|
|
9
|
+
{ id: 3, name: 'Charlie' },
|
|
10
|
+
];
|
|
11
|
+
const result = array_column(array, 'name');
|
|
12
|
+
expect(result).toEqual(['Alice', 'Bob', 'Charlie']);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test('Должна возвращать пустой массив, если передан пустой массив', () => {
|
|
16
|
+
const array = [];
|
|
17
|
+
const result = array_column(array, 'name');
|
|
18
|
+
expect(result).toEqual([]);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('Должна возвращать массив undefined, если ключ не найден в объектах', () => {
|
|
22
|
+
const array = [
|
|
23
|
+
{ id: 1, name: 'Alice' },
|
|
24
|
+
{ id: 2, name: 'Bob' },
|
|
25
|
+
{ id: 3, name: 'Charlie' },
|
|
26
|
+
];
|
|
27
|
+
const result = array_column(array, 'age');
|
|
28
|
+
expect(result).toEqual([undefined, undefined, undefined]);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('Должна извлекать значения указанного столбца и использовать указанный ключ для индексации', () => {
|
|
32
|
+
const array = [
|
|
33
|
+
{ id: 1, name: 'Alice' },
|
|
34
|
+
{ id: 2, name: 'Bob' },
|
|
35
|
+
{ id: 3, name: 'Charlie' },
|
|
36
|
+
];
|
|
37
|
+
const result = array_column(array, 'name', 'id');
|
|
38
|
+
expect(result).toEqual({ 1: 'Alice', 2: 'Bob', 3: 'Charlie' });
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('Должна возвращать пустой объект, если передан пустой массив и указан индексный ключ', () => {
|
|
42
|
+
const array = [];
|
|
43
|
+
const result = array_column(array, 'name', 'id');
|
|
44
|
+
expect(result).toEqual({});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('Должна возвращать объект с undefined значениями, если ключ не найден в объектах и указан индексный ключ', () => {
|
|
48
|
+
const array = [
|
|
49
|
+
{ id: 1, name: 'Alice' },
|
|
50
|
+
{ id: 2, name: 'Bob' },
|
|
51
|
+
{ id: 3, name: 'Charlie' },
|
|
52
|
+
];
|
|
53
|
+
const result = array_column(array, 'age', 'id');
|
|
54
|
+
expect(result).toEqual({ 1: undefined, 2: undefined, 3: undefined });
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('Должна выбрасывать ошибку, если переданное значение не является массивом', () => {
|
|
58
|
+
expect(() => array_column('not an array', 'name')).toThrow(TypeError);
|
|
59
|
+
expect(() => array_column('not an array', 'name')).toThrow(
|
|
60
|
+
'Параметр "value" должен быть списком.',
|
|
61
|
+
);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('Должна выбрасывать ошибку, если ключ не является строкой или целым числом', () => {
|
|
65
|
+
const array = [
|
|
66
|
+
{ id: 1, name: 'Alice' },
|
|
67
|
+
{ id: 2, name: 'Bob' },
|
|
68
|
+
{ id: 3, name: 'Charlie' },
|
|
69
|
+
];
|
|
70
|
+
expect(() => array_column(array, {})).toThrow(TypeError);
|
|
71
|
+
expect(() => array_column(array, {})).toThrow(
|
|
72
|
+
'Параметр "column_key" должен быть строкой или целым числом.',
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('Должна выбрасывать ошибку, если индексный ключ не является строкой, целым числом или null', () => {
|
|
77
|
+
const array = [
|
|
78
|
+
{ id: 1, name: 'Alice' },
|
|
79
|
+
{ id: 2, name: 'Bob' },
|
|
80
|
+
{ id: 3, name: 'Charlie' },
|
|
81
|
+
];
|
|
82
|
+
expect(() => array_column(array, 'name', {})).toThrow(TypeError);
|
|
83
|
+
expect(() => array_column(array, 'name', {})).toThrow(
|
|
84
|
+
'Параметр "index_key" должен быть строкой или целым числом.',
|
|
85
|
+
);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { expect, test, describe } from '@jest/globals';
|
|
2
|
+
import { array_combine } from '../../../index.mjs';
|
|
3
|
+
|
|
4
|
+
describe('Функция array_combine', () => {
|
|
5
|
+
test('Должна объединять два массива в ассоциативный массив', () => {
|
|
6
|
+
const keys = ['a', 'b', 'c'];
|
|
7
|
+
const values = [1, 2, 3];
|
|
8
|
+
const result = array_combine(keys, values);
|
|
9
|
+
expect(result).toEqual({ a: 1, b: 2, c: 3 });
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test('Должна возвращать пустой объект, если переданы пустые массивы', () => {
|
|
13
|
+
const keys = [];
|
|
14
|
+
const values = [];
|
|
15
|
+
const result = array_combine(keys, values);
|
|
16
|
+
expect(result).toEqual({});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('Должна выбрасывать ошибку, если переданное значение для ключей не является массивом', () => {
|
|
20
|
+
expect(() => array_combine('not an array', [1, 2, 3])).toThrow(TypeError);
|
|
21
|
+
expect(() => array_combine('not an array', [1, 2, 3])).toThrow(
|
|
22
|
+
'Параметр "keys" должен быть списком.',
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('Должна выбрасывать ошибку, если переданное значение для значений не является массивом', () => {
|
|
27
|
+
expect(() => array_combine(['a', 'b', 'c'], 'not an array')).toThrow(TypeError);
|
|
28
|
+
expect(() => array_combine(['a', 'b', 'c'], 'not an array')).toThrow(
|
|
29
|
+
'Параметр "values" должен быть списком.',
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test('Должна выбрасывать ошибку, если количество ключей и значений не совпадает', () => {
|
|
34
|
+
const keys = ['a', 'b'];
|
|
35
|
+
const values = [1, 2, 3];
|
|
36
|
+
expect(() => array_combine(keys, values)).toThrow(Error);
|
|
37
|
+
expect(() => array_combine(keys, values)).toThrow(
|
|
38
|
+
'Количество элементов в списке ключей должно ровняться количеству элементов в списке значений.',
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { expect, test, describe } from '@jest/globals';
|
|
2
|
+
import { array_count_values } from '../../../index.mjs';
|
|
3
|
+
|
|
4
|
+
describe('Функция array_count_values', () => {
|
|
5
|
+
test('Должна подсчитывать количество значений в массиве', () => {
|
|
6
|
+
const array = ['a', 'b', 'a', 'c', 'b', 'a'];
|
|
7
|
+
const result = array_count_values(array);
|
|
8
|
+
expect(result).toEqual({ a: 3, b: 2, c: 1 });
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test('Должна возвращать пустой объект, если передан пустой массив', () => {
|
|
12
|
+
const array = [];
|
|
13
|
+
const result = array_count_values(array);
|
|
14
|
+
expect(result).toEqual({});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('Должна корректно обрабатывать значения разных типов', () => {
|
|
18
|
+
const array = [1, '1', true, 'true', null, 'null', undefined, 'undefined'];
|
|
19
|
+
const result = array_count_values(array);
|
|
20
|
+
expect(result).toEqual({
|
|
21
|
+
1: 2,
|
|
22
|
+
true: 2,
|
|
23
|
+
null: 2,
|
|
24
|
+
undefined: 2,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('Должна выбрасывать ошибку, если переданное значение не является массивом', () => {
|
|
29
|
+
expect(() => array_count_values('not an array')).toThrow(TypeError);
|
|
30
|
+
expect(() => array_count_values('not an array')).toThrow(
|
|
31
|
+
'Параметр "value" должен быть массивом.',
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('Должна корректно обрабатывать ассоциативные массивы', () => {
|
|
36
|
+
const assoc = { key1: 'a', key2: 'b', key3: 'a', key4: 'c' };
|
|
37
|
+
const result = array_count_values(assoc);
|
|
38
|
+
expect(result).toEqual({ a: 2, b: 1, c: 1 });
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { expect, test, describe } from '@jest/globals';
|
|
2
|
+
import { array_diff } from '../../../index.mjs';
|
|
3
|
+
|
|
4
|
+
describe('Функция array_diff', () => {
|
|
5
|
+
test('Должна возвращать элементы из первого массива, которые отсутствуют в других массивах', () => {
|
|
6
|
+
const original_array = [1, 2, 3];
|
|
7
|
+
const array1 = [1, 2];
|
|
8
|
+
const result = array_diff(original_array, array1);
|
|
9
|
+
expect(result).toEqual({ 2: 3 });
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test('Должна возвращать пустой объект, если все элементы первого массива присутствуют в других массивах', () => {
|
|
13
|
+
const original_array = [1, 2];
|
|
14
|
+
const array1 = [1, 2];
|
|
15
|
+
const result = array_diff(original_array, array1);
|
|
16
|
+
expect(result).toEqual({});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('Должна корректно обрабатывать пустые массивы', () => {
|
|
20
|
+
const original_array = [];
|
|
21
|
+
const array1 = [];
|
|
22
|
+
const result = array_diff(original_array, array1);
|
|
23
|
+
expect(result).toEqual({});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('Должна выбрасывать ошибку, если переданное значение для original_array не является массивом', () => {
|
|
27
|
+
expect(() => array_diff('not an array')).toThrow(TypeError);
|
|
28
|
+
expect(() => array_diff('not an array')).toThrow(
|
|
29
|
+
'Параметр "original_array" должен быть массивом.',
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test('Должна выбрасывать ошибку, если переданное значение для arrays не является массивом', () => {
|
|
34
|
+
expect(() => array_diff([], 'not an array')).toThrow(TypeError);
|
|
35
|
+
expect(() => array_diff([], 'not an array')).toThrow(
|
|
36
|
+
'Параметр "arrays" должен быть массивом.',
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('Должна корректно обрабатывать массивы с различными типами данных', () => {
|
|
41
|
+
const original_array = [1, '2', true];
|
|
42
|
+
const array1 = [1, 2, false];
|
|
43
|
+
const result = array_diff(original_array, array1);
|
|
44
|
+
expect(result).toEqual({ 1: '2', 2: true });
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('Должна корректно обрабатывать массивы с объектами', () => {
|
|
48
|
+
const original_array = [{ id: 1 }, { id: 2 }, { id: 3 }];
|
|
49
|
+
const array1 = [{ id: 1 }, { id: 2 }];
|
|
50
|
+
const result = array_diff(original_array, array1);
|
|
51
|
+
expect(result).toEqual({ 2: { id: 3 } });
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('Должна корректно обрабатывать ассоциативные массивы', () => {
|
|
55
|
+
const original_array = { a: 1, b: 2, c: 3 };
|
|
56
|
+
const array1 = { a: 1, b: 2 };
|
|
57
|
+
const result = array_diff(original_array, array1);
|
|
58
|
+
expect(result).toEqual({ c: 3 });
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('Должна корректно обрабатывать несколько массивов для сравнения', () => {
|
|
62
|
+
const original_array = [1, 2, 3, 4];
|
|
63
|
+
const array1 = [1, 2];
|
|
64
|
+
const array2 = [3];
|
|
65
|
+
const result = array_diff(original_array, array1, array2);
|
|
66
|
+
expect(result).toEqual({ 3: 4 });
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('Должна корректно обрабатывать массивы с вложенными структурами', () => {
|
|
70
|
+
const original_array = [
|
|
71
|
+
{ id: 1, data: [1, 2] },
|
|
72
|
+
{ id: 2, data: [3, 4] },
|
|
73
|
+
];
|
|
74
|
+
const array1 = [{ id: 1, data: [1, 2] }];
|
|
75
|
+
const result = array_diff(original_array, array1);
|
|
76
|
+
expect(result).toEqual({ 1: { id: 2, data: [3, 4] } });
|
|
77
|
+
});
|
|
78
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { expect, test, describe } from '@jest/globals';
|
|
2
|
+
import { array_diff_assoc } from '../../../index.mjs';
|
|
3
|
+
|
|
4
|
+
describe('Функция array_diff_assoc', () => {
|
|
5
|
+
test('Должна возвращать элементы из первого массива, которые отсутствуют в других массивах', () => {
|
|
6
|
+
const original_array = { a: 1, b: 2, c: 3 };
|
|
7
|
+
const array1 = { a: 1, b: 2 };
|
|
8
|
+
const result = array_diff_assoc(original_array, array1);
|
|
9
|
+
expect(result).toEqual({ c: 3 });
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test('Должна возвращать пустой объект, если все элементы первого массива присутствуют в других массивах', () => {
|
|
13
|
+
const original_array = { a: 1, b: 2 };
|
|
14
|
+
const array1 = { a: 1, b: 2 };
|
|
15
|
+
const result = array_diff_assoc(original_array, array1);
|
|
16
|
+
expect(result).toEqual({});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('Должна корректно обрабатывать пустые массивы', () => {
|
|
20
|
+
const original_array = {};
|
|
21
|
+
const array1 = {};
|
|
22
|
+
const result = array_diff_assoc(original_array, array1);
|
|
23
|
+
expect(result).toEqual({});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('Должна выбрасывать ошибку, если переданное значение для original_array не является массивом', () => {
|
|
27
|
+
expect(() => array_diff_assoc('not an array')).toThrow(TypeError);
|
|
28
|
+
expect(() => array_diff_assoc('not an array')).toThrow(
|
|
29
|
+
'Параметр "original_array" должен быть массивом.',
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test('Должна выбрасывать ошибку, если переданное значение для arrays не является массивом', () => {
|
|
34
|
+
expect(() => array_diff_assoc([], 'not an array')).toThrow(TypeError);
|
|
35
|
+
expect(() => array_diff_assoc([], 'not an array')).toThrow(
|
|
36
|
+
'Параметр "arrays" должен быть массивом.',
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('Должна корректно обрабатывать массивы с различными типами данных', () => {
|
|
41
|
+
const original_array = { a: 1, b: '2', c: true };
|
|
42
|
+
const array1 = { a: 1, b: 2, d: false };
|
|
43
|
+
const result = array_diff_assoc(original_array, array1);
|
|
44
|
+
expect(result).toEqual({ b: '2', c: true });
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('Должна корректно обрабатывать несколько массивов для сравнения', () => {
|
|
48
|
+
const original_array = { a: 1, b: 2, c: 3, d: 4 };
|
|
49
|
+
const array1 = { a: 1, b: 2 };
|
|
50
|
+
const array2 = { c: 3 };
|
|
51
|
+
const result = array_diff_assoc(original_array, array1, array2);
|
|
52
|
+
expect(result).toEqual({ d: 4 });
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('Должна корректно обрабатывать массивы с вложенными структурами', () => {
|
|
56
|
+
const original_array = {
|
|
57
|
+
a: { id: 1, data: [1, 2] },
|
|
58
|
+
b: { id: 2, data: [3, 4] },
|
|
59
|
+
};
|
|
60
|
+
const array1 = { a: { id: 1, data: [1, 2] } };
|
|
61
|
+
const result = array_diff_assoc(original_array, array1);
|
|
62
|
+
expect(result).toEqual({ b: { id: 2, data: [3, 4] } });
|
|
63
|
+
});
|
|
64
|
+
});
|