СовÑеменнÑй ÑÑандаÑÑ JavaScript пÑедоÑÑавлÑÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ меÑодов Ð´Ð»Ñ Â«Ñмного» пеÑебоÑа маÑÑивов, коÑоÑÑе еÑÑÑ Ð² ÑовÑеменнÑÑ Ð±ÑаÑзеÑÐ°Ñ â¦
â¦ÐÑ Ð° Ð´Ð»Ñ Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки в IE8- пÑоÑÑо подклÑÑиÑе библиоÑÐµÐºÑ ES5-shim.
forEach
ÐеÑод «arr.forEach(callback[, thisArg])» иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑебоÑа маÑÑива.
Ðн Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа маÑÑива вÑзÑÐ²Ð°ÐµÑ ÑÑнкÑÐ¸Ñ callback.
ÐÑой ÑÑнкÑии он пеÑедаÑÑ ÑÑи паÑамеÑÑа callback(item, i, arr):
itemâ оÑеÑедной ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива.iâ его номеÑ.arrâ маÑÑив, коÑоÑÑй пеÑебиÑаеÑÑÑ.
ÐапÑимеÑ:
var arr = ["Яблоко", "ÐпелÑÑин", "ÐÑÑÑа"];
arr.forEach(function(item, i, arr) {
alert( i + ": " + item + " (маÑÑив:" + arr + ")" );
});
ÐÑоÑой, необÑзаÑелÑнÑй аÑгÑÐ¼ÐµÐ½Ñ forEach позволÑÐµÑ ÑказаÑÑ ÐºÐ¾Ð½ÑекÑÑ this Ð´Ð»Ñ callback. ÐÑ Ð¾Ð±ÑÑдим его в деÑалÑÑ
ÑÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ, ÑейÑÐ°Ñ Ð¾Ð½ нам не важен.
ÐеÑод forEach ниÑего не возвÑаÑаеÑ, его иÑполÑзÑÑÑ ÑолÑко Ð´Ð»Ñ Ð¿ÐµÑебоÑа, как более «ÑлеганÑнÑй» ваÑианÑ, Ñем обÑÑнÑй Ñикл for.
filter
ÐеÑод «arr.filter(callback[, thisArg])» иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑилÑÑÑаÑии маÑÑива ÑеÑез ÑÑнкÑиÑ.
Ðн ÑоздаÑÑ Ð½Ð¾Ð²Ñй маÑÑив, в коÑоÑÑй войдÑÑ ÑолÑко Ñе ÑлеменÑÑ arr, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
вÑзов callback(item, i, arr) возвÑаÑÐ¸Ñ true.
ÐапÑимеÑ:
var arr = [1, -1, 2, -2, 3];
var positiveArr = arr.filter(function(number) {
return number > 0;
});
alert( positiveArr ); // 1,2,3
map
ÐеÑод «arr.map(callback[, thisArg])» иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÑанÑÑоÑмаÑии маÑÑива.
Ðн ÑоздаÑÑ Ð½Ð¾Ð²Ñй маÑÑив, коÑоÑÑй бÑÐ´ÐµÑ ÑоÑÑоÑÑÑ Ð¸Ð· ÑезÑлÑÑаÑов вÑзова callback(item, i, arr) Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа arr.
ÐапÑимеÑ:
var names = ['HTML', 'CSS', 'JavaScript'];
var nameLengths = names.map(function(name) {
return name.length;
});
// полÑÑили маÑÑив Ñ Ð´Ð»Ð¸Ð½Ð°Ð¼Ð¸
alert( nameLengths ); // 4,3,10
every/some
ÐÑи меÑÐ¾Ð´Ñ Ð¸ÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¿ÑовеÑки маÑÑива.
- ÐеÑод «arr.every(callback[, thisArg])» возвÑаÑаеÑ
true, еÑли вÑзовcallbackвеÑнÑÑtrueÐ´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑаarr. - ÐеÑод «arr.some(callback[, thisArg])» возвÑаÑаеÑ
true, еÑли вÑзовcallbackвеÑнÑÑtrueÐ´Ð»Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾-нибÑÐ´Ñ ÑлеменÑаarr.
var arr = [1, -1, 2, -2, 3];
function isPositive(number) {
return number > 0;
}
alert( arr.every(isPositive) ); // false, не вÑе положиÑелÑнÑе
alert( arr.some(isPositive) ); // true, еÑÑÑ Ñ
оÑÑ Ð¾Ð´Ð½Ð¾ положиÑелÑное
reduce/reduceRight
ÐеÑод «arr.reduce(callback[, initialValue])» иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾ÑледоваÑелÑной обÑабоÑки каждого ÑлеменÑа маÑÑива Ñ ÑÐ¾Ñ Ñанением пÑомежÑÑоÑного ÑезÑлÑÑаÑа.
ÐÑо один из ÑамÑÑ ÑложнÑÑ Ð¼ÐµÑодов Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами. Ðо его ÑÑÐ¾Ð¸Ñ Ð¾ÑвоиÑÑ, поÑÐ¾Ð¼Ñ ÑÑо вÑеменами Ñ ÐµÐ³Ð¾ помоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ в неÑколÑко ÑÑÑок ÑеÑиÑÑ Ð·Ð°Ð´Ð°ÑÑ, коÑоÑÐ°Ñ Ð¸Ð½Ð°Ñе поÑÑебовала Ð±Ñ Ð² ÑÐ°Ð·Ñ Ð±Ð¾Ð»ÑÑе меÑÑа и вÑемени.
ÐеÑод reduce иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове маÑÑива какого-либо единого знаÑениÑ, инаÑе говоÑÑÑ Â«Ð´Ð»Ñ ÑвÑÑÑки маÑÑива». ЧÑÑÑ Ð´Ð°Ð»ÐµÐµ Ð¼Ñ ÑазбеÑÑм пÑÐ¸Ð¼ÐµÑ Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÑÑммÑ.
Ðн пÑименÑÐµÑ ÑÑнкÑÐ¸Ñ callback по оÑеÑеди к ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ Ð¼Ð°ÑÑива Ñлева напÑаво, ÑоÑ
ÑанÑÑ Ð¿Ñи ÑÑом пÑомежÑÑоÑнÑй ÑезÑлÑÑаÑ.
ÐÑгÑменÑÑ ÑÑнкÑии callback(previousValue, currentItem, index, arr):
previousValueâ поÑледний ÑезÑлÑÑÐ°Ñ Ð²Ñзова ÑÑнкÑии, он же «пÑомежÑÑоÑнÑй ÑезÑлÑÑаÑ».currentItemâ ÑекÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива, ÑлеменÑÑ Ð¿ÐµÑебиÑаÑÑÑÑ Ð¿Ð¾ оÑеÑеди Ñлева-напÑаво.indexâ Ð½Ð¾Ð¼ÐµÑ ÑекÑÑего ÑлеменÑа.arrâ обÑабаÑÑваемÑй маÑÑив.
ÐÑоме callback, меÑÐ¾Ð´Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑедаÑÑ Â«Ð½Ð°ÑалÑное знаÑение» â аÑгÑÐ¼ÐµÐ½Ñ initialValue. ÐÑли он еÑÑÑ, Ñо на пеÑвом вÑзове знаÑение previousValue бÑÐ´ÐµÑ Ñавно initialValue, а еÑли Ñ reduce Ð½ÐµÑ Ð²ÑоÑого аÑгÑменÑа, Ñо оно Ñавно пеÑÐ²Ð¾Ð¼Ñ ÑлеменÑÑ Ð¼Ð°ÑÑива, а пеÑÐµÐ±Ð¾Ñ Ð½Ð°ÑинаеÑÑÑ Ñо вÑоÑого.
ÐÑоÑе вÑего понÑÑÑ ÑабоÑÑ Ð¼ÐµÑода reduce на пÑимеÑе.
ÐапÑимеÑ, в каÑеÑÑве «ÑвÑÑÑки» Ð¼Ñ Ñ Ð¾Ñим полÑÑиÑÑ ÑÑÐ¼Ð¼Ñ Ð²ÑÐµÑ ÑлеменÑов маÑÑива.
ÐÐ¾Ñ ÑеÑение в Ð¾Ð´Ð½Ñ ÑÑÑокÑ:
var arr = [1, 2, 3, 4, 5]
// Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа маÑÑива запÑÑÑиÑÑ ÑÑнкÑиÑ,
// пÑомежÑÑоÑнÑй ÑезÑлÑÑÐ°Ñ Ð¿ÐµÑедаваÑÑ Ð¿ÐµÑвÑм аÑгÑменÑом далее
var result = arr.reduce(function(sum, current) {
return sum + current;
}, 0);
alert( result ); // 15
РазбеÑÑм, ÑÑо в нÑм пÑоиÑÑ Ð¾Ð´Ð¸Ñ.
ÐÑи пеÑвом запÑÑке sum â иÑÑ
одное знаÑение, Ñ ÐºÐ¾ÑоÑого наÑинаÑÑÑÑ Ð²ÑÑиÑлениÑ, Ñавно нÑÐ»Ñ (вÑоÑой аÑгÑÐ¼ÐµÐ½Ñ reduce).
СнаÑала Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ Ñ ÑÑим наÑалÑнÑм знаÑением и пеÑвÑм ÑлеменÑом маÑÑива, ÑезÑлÑÑÐ°Ñ Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑÑÑ Ð¸ пеÑедаÑÑÑÑ Ð² ÑледÑÑÑий вÑзов, Ñже Ñо вÑоÑÑм аÑгÑменÑом маÑÑива, заÑем новое знаÑение ÑÑаÑÑвÑÐµÑ Ð² вÑÑиÑлениÑÑ Ñ ÑÑеÑÑим аÑгÑменÑом и Ñак далее.
ÐоÑок вÑÑиÑлений полÑÑаеÑÑÑ Ñакой
Рвиде ÑаблиÑÑ Ð³Ð´Ðµ ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑÑока â вÑзов ÑÑнкÑии на оÑеÑедном ÑлеменÑе маÑÑива:
sum |
current |
ÑезÑлÑÑÐ°Ñ | |
|---|---|---|---|
| пеÑвÑй вÑзов | 0 |
1 |
1 |
| вÑоÑой вÑзов | 1 |
2 |
3 |
| ÑÑеÑий вÑзов | 3 |
3 |
6 |
| ÑеÑвÑÑÑÑй вÑзов | 6 |
4 |
10 |
| пÑÑÑй вÑзов | 10 |
5 |
15 |
Ðак видно, ÑезÑлÑÑÐ°Ñ Ð¿ÑедÑдÑÑего вÑзова пеÑедаÑÑÑÑ Ð² пеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ ÑледÑÑÑего.
ÐÑÑаÑи, полнÑй Ð½Ð°Ð±Ð¾Ñ Ð°ÑгÑменÑов ÑÑнкÑии Ð´Ð»Ñ reduce вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ function(sum, current, i, array), Ñо еÑÑÑ Ð½Ð¾Ð¼ÐµÑ ÑекÑÑего вÑзова i и веÑÑ Ð¼Ð°ÑÑив arr, но здеÑÑ Ð² ниÑ
Ð½ÐµÑ Ð½ÑждÑ.
ÐоÑмоÑÑим, ÑÑо бÑдеÑ, еÑли не ÑказаÑÑ initialValue в вÑзове arr.reduce:
var arr = [1, 2, 3, 4, 5]
// ÑбÑали 0 в конÑе
var result = arr.reduce(function(sum, current) {
return sum + current
});
alert( result ); // 15
РезÑлÑÑÐ°Ñ â ÑоÑно Ñакой же! ÐÑо поÑомÑ, ÑÑо пÑи оÑÑÑÑÑÑвии initialValue в каÑеÑÑве пеÑвого знаÑÐµÐ½Ð¸Ñ Ð±ÐµÑÑÑÑÑ Ð¿ÐµÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива, а пеÑÐµÐ±Ð¾Ñ ÑÑаÑÑÑÐµÑ Ñо вÑоÑого.
ТаблиÑа вÑÑиÑлений бÑÐ´ÐµÑ ÑÐ°ÐºÐ°Ñ Ð¶Ðµ, за вÑÑеÑом пеÑвой ÑÑÑоки.
ÐеÑод arr.reduceRight ÑабоÑÐ°ÐµÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно, но идÑÑ Ð¿Ð¾ маÑÑÐ¸Ð²Ñ ÑпÑава-налево.
ÐÑого
ÐÑ ÑаÑÑмоÑÑели меÑодÑ:
forEachâ Ð´Ð»Ñ Ð¿ÐµÑебоÑа маÑÑива.filterâ Ð´Ð»Ñ ÑилÑÑÑаÑии маÑÑива.every/someâ Ð´Ð»Ñ Ð¿ÑовеÑки маÑÑива.mapâ Ð´Ð»Ñ ÑÑанÑÑоÑмаÑии маÑÑива в маÑÑив.reduce/reduceRightâ Ð´Ð»Ñ Ð¿ÑÐ¾Ñ Ð¾Ð´Ð° по маÑÑÐ¸Ð²Ñ Ñ Ð²ÑÑиÑлением знаÑениÑ.
Ðо многиÑ
ÑиÑÑаÑиÑÑ
иÑ
иÑполÑзование позволÑÐµÑ Ð½Ð°Ð¿Ð¸ÑаÑÑ ÐºÐ¾Ð´ коÑоÑе и понÑÑнее, Ñем обÑÑнÑй пеÑÐµÐ±Ð¾Ñ ÑеÑез for.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)