ÐаÑиви пÑопонÑÑÑÑ Ð±ÐµÐ·Ð»ÑÑ Ð¼ÐµÑодÑв. Щоб бÑло пÑоÑÑÑÑе, в ÑÑÐ¾Ð¼Ñ ÑоздÑÐ»Ñ Ð²Ð¾Ð½Ð¸ ÑозбиÑÑ Ð½Ð° гÑÑпи.
ÐодаваннÑ/Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв
Ðи вже знаÑмо меÑоди, ÑÐºÑ Ð´Ð¾Ð´Ð°ÑÑÑ Ñи видалÑÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи з поÑаÑÐºÑ Ñи з кÑнÑÑ:
arr.push(...items)â Ð´Ð¾Ð´Ð°Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи до кÑнÑÑ,arr.pop()â дÑÑÑÐ°Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð· кÑнÑÑ,arr.shift()â дÑÑÑÐ°Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð· поÑаÑкÑ,arr.unshift(...items)â Ð´Ð¾Ð´Ð°Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи в поÑаÑок.
РозглÑнемо й ÑнÑÑ.
splice
Як видалиÑи ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð· маÑивÑ?
ÐаÑиви Ñ Ð¾Ð±âÑкÑами, ÑÐ¾Ð¼Ñ Ð¼Ð¸ можемо ÑпÑобÑваÑи викоÑиÑÑаÑи delete:
let arr = ["I", "go", "home"];
delete arr[1]; // видалимо "go"
alert( arr[1] ); // undefined
// ÑÐµÐ¿ÐµÑ arr = ["I", , "home"];
alert( arr.length ); // 3
ÐаÑебÑо, ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð±Ñв видалений, але пÑи пеÑевÑÑÑÑ Ð²Ð¸ÑвлÑÑÑÑÑÑ, Ñо маÑив вÑе Ñе Ð¼Ð°Ñ 3 елеменÑи arr.length == 3.
Це ноÑмалÑно, ÑÐ¾Ð¼Ñ Ñо вÑе, Ñо ÑобиÑÑ delete obj.key â Ñе видалÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð·Ð° клÑÑем key. Це ноÑмалÑно Ð´Ð»Ñ Ð¾Ð±Ê¼ÑкÑÑв, але Ð´Ð»Ñ Ð¼Ð°ÑивÑв ми звиÑайно Ñ
оÑемо, Ñоб ÑнÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи змÑÑÑилиÑÑ Ñ Ð·Ð°Ð¹Ð½Ñли мÑÑÑе, Ñо звÑлÑнилоÑÑ. Ðи ÑекаÑмо, Ñо маÑив ÑÑане коÑоÑÑим.
Ð¢Ð¾Ð¼Ñ ÑлÑд заÑÑоÑовÑваÑи ÑпеÑÑалÑÐ½Ñ Ð¼ÐµÑоди.
ÐеÑод arr.splice â Ñе ÑнÑвеÑÑалÑний «ÑвейÑаÑÑÑкий нÑж» Ð´Ð»Ñ ÑобоÑи з маÑивами. ÐмÑÑ Ð²Ñе: додаваÑи, видалÑÑи Ñ Ð·Ð°Ð¼ÑнÑваÑи елеменÑи.
Ðого ÑинÑакÑиÑ:
arr.splice(start[, deleteCount, elem1, ..., elemN])
ÐÑн змÑнÑÑ arr поÑинаÑÑи з позиÑÑÑ start: видалÑÑ deleteCount елеменÑÑв Ñ Ð²ÑÑавлÑÑ elem1, ..., elemN на ÑÑ
мÑÑÑе. ÐовеÑÑаÑÑÑÑÑ Ð¼Ð°Ñив з видалениÑ
елеменÑÑв.
Цей меÑод легко зÑозÑмÑÑи на пÑÐ¸ÐºÐ»Ð°Ð´Ð°Ñ .
ÐоÑнемо з видаленнÑ:
let arr = ["I", "study", "JavaScript"];
arr.splice(1, 1); // з ÑндекÑÑ 1 видалимо 1 елеменÑ
alert( arr ); // ["I", "JavaScript"]
Ðегко, пÑавда? ÐоÑинаÑÑи з ÑндекÑÑ 1, вÑн видалив 1 елеменÑ.
У наÑÑÑÐ¿Ð½Ð¾Ð¼Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð¼Ð¸ видалÑÑмо 3 елеменÑи Ñа замÑнÑÑмо ÑÑ Ð´Ð²Ð¾Ð¼Ð° ÑнÑими:
let arr = ["I", "study", "JavaScript", "right", "now"];
// видалимо 3 пеÑÑиÑ
елеменÑи Ñ Ð·Ð°Ð¼Ñнимо ÑÑ
ÑнÑими
arr.splice(0, 3, "Let's", "dance");
alert( arr ) // оÑÑимаÑм ["Let's", "dance", "right", "now"]
ТÑÑ Ð¼Ð¸ баÑимо, Ñо splice повеÑÑÐ°Ñ Ð¼Ð°Ñив видалениÑ
елеменÑÑв:
let arr = ["I", "study", "JavaScript", "right", "now"];
// видалимо 2 пеÑÑиÑ
елеменÑи
let removed = arr.splice(0, 2);
alert( removed ); // "I", "study" <-- маÑив видалениÑ
елеменÑÑв
ÐеÑод splice Ñакож може вÑÑавлÑÑи елеменÑи без бÑдÑ-ÑкиÑ
видаленÑ. ÐÐ»Ñ ÑÑого нам поÑÑÑбно вÑÑановиÑи знаÑÐµÐ½Ð½Ñ 0 Ð´Ð»Ñ deleteCount:
let arr = ["I", "study", "JavaScript"];
// поÑинаÑÑÑ Ð· ÑндекÑа 2
// видалимо 0 елеменÑÑв
// ваÑÑавиÑи "complex" Ñа "language"
arr.splice(2, 0, "complex", "language");
alert( arr ); // "I", "study", "complex", "language", "JavaScript"
ТÑÑ Ñ Ð² ÑнÑÐ¸Ñ Ð¼ÐµÑÐ¾Ð´Ð°Ñ Ð¼Ð°ÑÐ¸Ð²Ñ Ð´Ð¾Ð¿ÑÑкаÑÑÑÑÑ Ð²ÑдʼÑÐ¼Ð½Ñ ÑндекÑи. Ðони дозволÑÑÑÑ Ð¿Ð¾ÑаÑи вÑдлÑк елеменÑÑв з кÑнÑÑ, Ñк ÑÑÑ:
let arr = [1, 2, 5];
// поÑинаÑÑи з ÑндекÑÑ -1 (пеÑед оÑÑаннÑм елеменÑом)
// видалимо 0 елеменÑÑв,
// вÑÑавимо знаÑÐµÐ½Ð½Ñ 3 Ñа 4
arr.splice(-1, 0, 3, 4);
alert( arr ); // 1,2,3,4,5
slice
ÐеÑод arr.slice набагаÑо пÑоÑÑÑÑий, нÑж ÑÑ
ожий на нÑого arr.splice.
Ðого ÑинÑакÑиÑ:
arr.slice([start], [end])
ÐÑн повеÑÑÐ°Ñ Ð½Ð¾Ð²Ð¸Ð¹ маÑив, копÑÑÑÑи до нÑого вÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи вÑд ÑндекÑÑ start до end (не вклÑÑаÑÑи end). Ð start, Ñ end можÑÑÑ Ð±ÑÑи вÑдʼÑмними. Ð ÑÐ°ÐºÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð²ÑдлÑк бÑде здÑйÑнÑваÑиÑÑ Ð· кÑнÑÑ Ð¼Ð°ÑивÑ.
ÐÑн подÑбний до ÑÑдкового меÑÐ¾Ð´Ñ str.slice, але замÑÑÑÑ Ð¿ÑдÑÑдкÑв ÑÑвоÑÑÑ Ð¿ÑдмаÑиви.
ÐапÑиклад:
let arr = ["t", "e", "s", "t"];
alert( arr.slice(1, 3) ); // e,s (копÑÑÑ Ð· 1 до 3)
alert( arr.slice(-2) ); // s,t (копÑÑÑ Ð· -2 до кÑнÑÑ)
Ðожна викликаÑи slice Ñ Ð²Ð·Ð°Ð³Ð°Ð»Ñ Ð±ÐµÐ· аÑгÑменÑÑв. arr.slice() ÑÑвоÑиÑÑ ÐºÐ¾Ð¿ÑÑ Ð¼Ð°ÑÐ¸Ð²Ñ arr. Це ÑаÑÑо викоÑиÑÑовÑÑÑÑ, Ñоб ÑÑвоÑиÑи копÑÑ Ð¼Ð°ÑÐ¸Ð²Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð»ÑÑиÑ
пеÑеÑвоÑенÑ, ÑÐºÑ Ð½Ðµ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð·Ð¼ÑнÑваÑи виÑ
Ñдний маÑив.
concat
ÐеÑод arr.concat ÑÑвоÑÑÑ Ð½Ð¾Ð²Ð¸Ð¹ маÑив, в Ñкий копÑÑÑ Ð´Ð°Ð½Ñ Ð· ÑнÑÐ¸Ñ Ð¼Ð°ÑивÑв Ñа додаÑÐºÐ¾Ð²Ñ Ð·Ð½Ð°ÑеннÑ.
Ðого ÑинÑакÑиÑ:
arr.concat(arg1, arg2...)
ÐÑн пÑÐ¸Ð¹Ð¼Ð°Ñ Ð±ÑдÑ-ÑÐºÑ ÐºÑлÑкÑÑÑÑ Ð°ÑгÑменÑÑв â маÑивÑв або знаÑенÑ.
РезÑлÑÑаÑом Ñ Ð½Ð¾Ð²Ð¸Ð¹ маÑив, Ñо мÑÑÑиÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи з arr, поÑÑмarg1, arg2 ÑоÑо.
ЯкÑо аÑгÑÐ¼ÐµÐ½Ñ argN Ñ Ð¼Ð°Ñивом, Ñо вÑÑ Ð¹Ð¾Ð³Ð¾ елеменÑи копÑÑÑÑÑÑÑ. Ð ÑнÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð±Ñде ÑкопÑйовано Ñам аÑгÑменÑ.
ÐапÑиклад:
let arr = [1, 2];
// ÑÑвоÑимо маÑив з: arr Ñ [3,4]
alert( arr.concat([3, 4]) ); // 1,2,3,4
// ÑÑвоÑимо маÑив з: arr, [3,4] Ñ [5,6]
alert( arr.concat([3, 4], [5, 6]) ); // 1,2,3,4,5,6
// ÑÑвоÑимо маÑив з: arr Ñ [3,4], Ñакож добавимо знаÑÐµÐ½Ð½Ñ 5 Ñ 6
alert( arr.concat([3, 4], 5, 6) ); // 1,2,3,4,5,6
ÐазвиÑай вÑн пÑоÑÑо копÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи з маÑивÑв. ÐнÑÑ Ð¾Ð±Ê¼ÑкÑи, навÑÑÑ ÑкÑо вони виглÑдаÑÑÑ Ñк маÑиви, додаÑÑÑÑÑ Ñк Ñ:
let arr = [1, 2];
let arrayLike = {
0: "something",
length: 1
};
alert( arr.concat(arrayLike) ); // 1,2,[object Object]
⦠Ðле ÑкÑо обʼÑÐºÑ Ð¼Ð°Ñ ÑпеÑÑалÑÐ½Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ Symbol.isConcatSpreadable, Ñо вÑн обÑоблÑÑÑÑÑÑ concat Ñк маÑив: замÑÑÑÑ Ð½Ñого додаÑÑÑÑÑ Ð¹Ð¾Ð³Ð¾ ÑиÑÐ»Ð¾Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ. ÐÐ»Ñ ÐºÐ¾ÑекÑÐ½Ð¾Ñ Ð¾Ð±Ñобки в обʼÑкÑÑ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи ÑиÑÐ»Ð¾Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ñа length:
let arr = [1, 2];
let arrayLike = {
0: "something",
1: "else",
[Symbol.isConcatSpreadable]: true,
length: 2
};
alert( arr.concat(arrayLike) ); // 1,2,something,else
ÐеÑебÑÑ: forEach
ÐеÑод arr.forEach дозволÑÑ Ð·Ð°Ð¿ÑÑкаÑи ÑÑнкÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елеменÑа маÑивÑâ¦
Ðого ÑинÑакÑиÑ:
arr.forEach(function(item, index, array) {
// ... Ñобимо ÑоÑÑ Ð· item
});
ÐапÑиклад, Ñей код виведе на екÑан кожен ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑивÑ:
// Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елеменÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑÑÑ alert
["Bilbo", "Gandalf", "Nazgul"].forEach(alert);
Ð Ñей до Ñого ж ÑозповÑÑÑÑ Ñ Ð¿Ñо ÑÐ²Ð¾Ñ Ð¿Ð¾Ð·Ð¸ÑÑÑ Ð² маÑивÑ:
["Bilbo", "Gandalf", "Nazgul"].forEach((item, index, array) => {
alert(`${item} Ð¼Ð°Ñ Ð¿Ð¾Ð·Ð¸ÑÑÑ ${index} в маÑÐ¸Ð²Ñ ${array}`);
});
РезÑлÑÑÐ°Ñ ÑÑнкÑÑÑ (ÑкÑо вона Ð²Ð·Ð°Ð³Ð°Ð»Ñ ÑоÑÑ Ð¿Ð¾Ð²ÐµÑÑаÑ) вÑдкидаÑÑÑÑÑ Ñ ÑгноÑÑÑÑÑÑÑ.
ÐоÑÑк в маÑивÑ
ÐÐ°Ð»Ñ ÑозглÑнемо меÑоди, ÑÐºÑ Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð¶ÑÑÑ Ð·Ð½Ð°Ð¹Ñи Ñо-небÑÐ´Ñ Ð² маÑивÑ.
indexOf/lastIndexOf Ñа includes
ÐеÑоди arr.indexOf Ñа arr.includes маÑÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¹ ÑинÑакÑÐ¸Ñ Ñ ÑоблÑÑÑ Ð¿Ð¾ ÑÑÑÑ Ñе ж Ñаме, Ñо Ñ ÑÑ ÑÑÐ´ÐºÐ¾Ð²Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸, але пÑаÑÑÑÑÑ Ð· елеменÑами замÑÑÑÑ ÑимволÑв:
arr.indexOf(item, from)â ÑÑкаÑitem, поÑинаÑÑи з ÑндекÑÑfrom, Ñ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ ÑндекÑ, на ÑÐºÐ¾Ð¼Ñ Ð±Ñв знайдений ÑÑканий елеменÑ, в ÑнÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ-1.arr.includes(item, from)â ÑÑкаÑitem, поÑинаÑÑи з ÑндекÑÑfrom, Ñ Ð¿Ð¾Ð²ÐµÑÑаÑtrue, ÑкÑо поÑÑк ÑÑпÑÑний.
ÐазвиÑай ÑÑ Ð¼ÐµÑоди викоÑиÑÑовÑÑÑÑÑÑ Ð»Ð¸Ñе з одним аÑгÑменÑом: item Ð´Ð»Ñ Ð¿Ð¾ÑÑкÑ. Типово поÑÑк вÑдбÑваÑÑÑÑÑ Ð· Ñамого поÑаÑкÑ.
ÐапÑиклад:
let arr = [1, 0, false];
alert( arr.indexOf(0) ); // 1
alert( arr.indexOf(false) ); // 2
alert( arr.indexOf(null) ); // -1
alert( arr.includes(1) ); // true
ÐвеÑнÑÑÑ ÑвагÑ, Ñо меÑод indexOf викоÑиÑÑовÑÑ ÑÑвоÑе поÑÑвнÑÐ½Ð½Ñ ===. Таким Ñином, ÑкÑо ми ÑÑкаÑмо false, вÑн знаÑ
одиÑÑ Ñаме false, але не нÑлÑ.
ЯкÑо ми Ñ
оÑемо пеÑевÑÑиÑи наÑвнÑÑÑÑ item в маÑÑивÑ, Ñ Ð½ÐµÐ¼Ð° поÑÑеби знаÑи його ÑоÑний ÑндекÑ, ÑÐ¾Ð´Ñ ÐºÑаÑе викоÑиÑÑаÑи arr.includes.
ÐеÑод arr.lastIndexOf Ñакий Ñамий, Ñк indexOf, але ÑÑÐºÐ°Ñ ÑпÑава налÑво.
let fruits = ['Apple', 'Orange', 'Apple']
alert( fruits.indexOf('Apple') ); // 0 (пеÑÑий Apple)
alert( fruits.lastIndexOf('Apple') ); // 2 (оÑÑаннÑй Apple)
includes пÑавилÑно обÑоблÑÑ NaNÐезнаÑноÑ, але ваÑÑÐ¾Ñ Ñваги влаÑÑивÑÑÑÑ includes Ñ Ñе, Ñо вÑн пÑавилÑно обÑоблÑÑ NaN, на вÑдмÑÐ½Ñ Ð²Ñд indexOf:
const arr = [NaN];
alert( arr.indexOf(NaN) ); // -1 (повинен бÑÑи 0, але === пеÑевÑÑка на ÑÑвнÑÑÑÑ Ð½Ðµ пÑаÑÑÑ Ð· NaN)
alert( arr.includes(NaN) );// true (вÑÑно)
Це повâÑзано з Ñим, Ñо меÑод includes бÑв доданий до JavaScript знаÑно пÑзнÑÑе Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑ Ð±ÑлÑÑ ÑÑÑаÑний алгоÑиÑм поÑÑвнÑннÑ.
find Ñ findIndex/findLastIndex
УÑвÑÑÑ, Ñо Ñ Ð½Ð°Ñ Ñ Ð¼Ð°Ñив обʼÑкÑÑв. Як нам знайÑи обʼÑÐºÑ Ð·Ð° Ð¿ÐµÐ²Ð½Ð¾Ñ ÑмовоÑ?
ТÑÑ ÑÑане в Ð½Ð°Ð³Ð¾Ð´Ñ Ð¼ÐµÑод arr.find(fn).
Ðого ÑинÑакÑÐ¸Ñ Ñакий:
let result = arr.find(function(item, index, array) {
// ÑкÑо true - повеÑÑаÑÑÑÑÑ Ð¿Ð¾ÑоÑний ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ñ Ð¿ÐµÑебÑÑ Ð·Ð°ÐºÑнÑÑÑÑÑÑÑ
// ÑкÑо вÑÑ ÑÑеÑаÑÑÑ Ð²Ð¸ÑвилиÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ð²Ð¸Ð¼Ð¸, повеÑÑаÑÑÑÑÑ undefined
});
ФÑнкÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑÑÑ Ð¿Ð¾ ÑеÑÐ·Ñ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елеменÑа маÑивÑ:
itemâ ÑеÑговий ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑивÑ.indexâ його ÑндекÑ.arrayâ Ñам маÑив.
ЯкÑо ÑÑнкÑÑÑ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ true, поÑÑк пÑипинÑÑÑÑÑÑ, повеÑÑаÑÑÑÑÑ item. ЯкÑо нÑÑого не знайдено, повеÑÑаÑÑÑÑÑ undefined.
ÐапÑиклад, Ñ Ð½Ð°Ñ Ñ Ð¼Ð°Ñив коÑиÑÑÑваÑÑв, кожен з ÑкиÑ
Ð¼Ð°Ñ Ð¿Ð¾Ð»Ñ id Ñа name. ÐавайÑе знайдемо Ñой де id == 1:
let users = [
{id: 1, name: "John"},
{id: 2, name: "Pete"},
{id: 3, name: "Mary"}
];
let user = users.find(item => item.id == 1);
alert(user.name); // John
У ÑеалÑÐ½Ð¾Ð¼Ñ Ð¶Ð¸ÑÑÑ Ð¼Ð°Ñиви обʼÑкÑÑв â звиÑайна ÑпÑава, ÑÐ¾Ð¼Ñ Ð¼ÐµÑод find вкÑай коÑиÑний.
ÐвеÑнÑÑÑ ÑвагÑ, Ñо в Ð´Ð°Ð½Ð¾Ð¼Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð¼Ð¸ пеÑедаÑмо find ÑÑнкÑÑÑ item => item.id == 1, з одним аÑгÑменÑом. Це Ñипово, ÑнÑÑ Ð°ÑгÑменÑи ÑÑÑÑ ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ ÑÑдко.
ÐеÑод arr.findIndex â по ÑÑÑÑ, Ñе ж Ñаме, але повеÑÑÐ°Ñ ÑндекÑ, на ÑÐºÐ¾Ð¼Ñ Ð±Ñв знайдений елеменÑ, а не Ñам елеменÑ, Ñ -1, ÑкÑо нÑÑого не знайдено.
ÐеÑод arr.findLastIndex ÑÑ
ожий на findIndex, але ÑÑÐºÐ°Ñ ÑпÑава налÑво, подÑбно до lastIndexOf.
ÐÑÑ Ð¿Ñиклад:
let users = [
{id: 1, name: "John"},
{id: 2, name: "Pete"},
{id: 3, name: "Mary"},
{id: 4, name: "John"}
];
// Ðнайдемо ÑÐ½Ð´ÐµÐºÑ Ð¿ÐµÑÑого John
alert(users.findIndex(user => user.name == 'John')); // 0
// Ðнайдемо ÑÐ½Ð´ÐµÐºÑ Ð¾ÑÑаннÑого John
alert(users.findLastIndex(user => user.name == 'John')); // 3
filter
ÐеÑод find ÑÑÐºÐ°Ñ Ð¾Ð´Ð¸Ð½ (пеÑÑий) елеменÑ, на ÑÐºÐ¾Ð¼Ñ ÑÑнкÑÑÑ-колбек повеÑне true.
Ðа Ñой випадок, ÑкÑо Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¸Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв може бÑÑи багаÑо, пеÑедбаÑений меÑод arr.filter(fn).
СинÑакÑÐ¸Ñ ÑÑого меÑÐ¾Ð´Ñ ÑÑ
ожий з find, але filter повеÑÑÐ°Ñ Ð¼Ð°Ñив з ÑÑÑÑ
вÑдÑÑлÑÑÑованиÑ
елеменÑÑв:
let results = arr.filter(function(item, index, array) {
// ÑкÑо true - ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð¾Ð´Ð°ÑÑÑÑÑ Ð´Ð¾ ÑезÑлÑÑаÑÑ, Ñ Ð¿ÐµÑебÑÑ ÑÑиваÑ
// повеÑÑаÑÑÑÑÑ Ð¿Ð¾ÑожнÑй маÑив в ÑазÑ, ÑкÑо нÑÑого не знайдено
});
ÐапÑиклад:
let users = [
{id: 1, name: "John"},
{id: 2, name: "Pete"},
{id: 3, name: "Mary"}
];
// повеÑÑÐ°Ñ Ð¼Ð°Ñив пеÑÑиÑ
двоÑ
коÑиÑÑÑваÑÑв
let someUsers = users.filter(item => item.id < 3);
alert(someUsers.length); // 2
ÐеÑеÑвоÑÐµÐ½Ð½Ñ Ð¼Ð°ÑивÑ
ÐеÑейдемо до меÑодÑв пеÑеÑвоÑÐµÐ½Ð½Ñ Ñ Ð²Ð¿Ð¾ÑÑдкÑÐ²Ð°Ð½Ð½Ñ Ð¼Ð°ÑивÑ.
map
ÐеÑод arr.map Ñ Ð¾Ð´Ð½Ð¸Ð¼ з найбÑлÑÑ ÐºÐ¾ÑиÑÐ½Ð¸Ñ Ñ ÑаÑÑо викоÑиÑÑовÑÐ²Ð°Ð½Ð¸Ñ .
ÐÑн Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ ÑÑнкÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елеменÑа маÑÐ¸Ð²Ñ Ñ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ Ð¼Ð°Ñив ÑезÑлÑÑаÑÑв Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÑÑÑÑ ÑÑнкÑÑÑ.
СинÑакÑиÑ:
let result = arr.map(function(item, index, array) {
// повеÑÑаÑÑÑÑÑ Ð½Ð¾Ð²Ðµ знаÑÐµÐ½Ð½Ñ Ð·Ð°Ð¼ÑÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа
});
ÐапÑиклад, ÑÑÑ Ð¼Ð¸ пеÑеÑвоÑÑÑмо кожен ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð° його довжинÑ:
let lengths = ["Bilbo", "Gandalf", "Nazgul"].map(item => item.length);
alert(lengths); // 5,7,6
sort(fn)
Ðиклик arr.sort() ÑоÑÑÑÑ Ð¼Ð°Ñив âна мÑÑÑÑâ, змÑнÑÑÑи в нÑÐ¾Ð¼Ñ Ð¿Ð¾ÑÑдок елеменÑÑв.
ÐÑн повеÑÑÐ°Ñ Ð²ÑдÑоÑÑований маÑив, але зазвиÑай повеÑнене знаÑÐµÐ½Ð½Ñ ÑгноÑÑÑÑÑÑÑ, оÑкÑлÑки змÑнÑÑÑÑÑÑ Ñам arr.
ÐапÑиклад:
let arr = [ 1, 2, 15 ];
// меÑод ÑоÑÑÑÑ Ð²Ð¼ÑÑÑ arr
arr.sort();
alert( arr ); // 1, 15, 2
Чи не помÑÑили нÑÑого дивного в ÑÑÐ¾Ð¼Ñ Ð¿ÑикладÑ?
ÐоÑÑдок ÑÑав 1, 15, 2. Це непÑавилÑно! Ðле ÑомÑ?
Ðа замовÑÑваннÑм елеменÑи ÑоÑÑÑÑÑÑÑÑ Ñк ÑÑдки.
ÐÑквалÑно, елеменÑи пеÑеÑвоÑÑÑÑÑÑÑ Ð² ÑÑдки пÑи поÑÑвнÑннÑ. ÐÐ»Ñ ÑÑдкÑв заÑÑоÑовÑÑÑÑÑÑ Ð»ÐµÐºÑикогÑаÑÑÑний поÑÑдок, Ñ Ð´ÑйÑно виÑ
одиÑÑ, Ñо "2"> "15".
Щоб викоÑиÑÑовÑваÑи Ð½Ð°Ñ Ð²Ð»Ð°Ñний поÑÑдок ÑоÑÑÑваннÑ, нам поÑÑÑбно надаÑи ÑÑнкÑÑÑ Ñк аÑгÑÐ¼ÐµÐ½Ñ arr.sort().
ФÑнкÑÑÑ Ð¼Ð°Ñ Ð¿Ð¾ÑÑвнÑÑи два довÑлÑÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ñа повеÑнÑÑи:
function compare(a, b) {
if (a > b) return 1; // ÑкÑо пеÑÑе знаÑÐµÐ½Ð½Ñ Ð±ÑлÑÑе за дÑÑге
if (a == b) return 0; // ÑкÑо знаÑÐµÐ½Ð½Ñ ÑÑвнÑ
if (a < b) return -1; // ÑкÑо пеÑÑе знаÑÐµÐ½Ð½Ñ Ð¼ÐµÐ½ÑÑе за дÑÑге
}
ÐапÑиклад, Ð´Ð»Ñ ÑоÑÑÑÐ²Ð°Ð½Ð½Ñ ÑиÑел:
function compareNumeric(a, b) {
if (a > b) return 1;
if (a == b) return 0;
if (a < b) return -1;
}
let arr = [ 1, 2, 15 ];
arr.sort(compareNumeric);
alert(arr); // 1, 2, 15
Ð¢ÐµÐ¿ÐµÑ Ð²Ñе пÑаÑÑÑ Ñк ÑÑеба.
ÐÑзÑмÑмо паÑÐ·Ñ Ñ Ð¿Ð¾Ð´ÑмаÑмо, Ñо ж вÑдбÑваÑÑÑÑÑ. Ðгаданий ÑанÑÑе маÑив arr може бÑÑи маÑивом Ñого завгодно, вÑÑно? ÐÑн може мÑÑÑиÑи ÑиÑла, ÑÑдки, обʼÑкÑи або ÑоÑÑ Ñе. У Ð½Ð°Ñ Ñ Ð½Ð°Ð±ÑÑ ÑкиÑ
оÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв. Щоб впоÑÑдкÑваÑи його, нам поÑÑÑбна ÑÑнкÑÑÑ, Ñка визнаÑÐ°Ñ Ð¿Ð¾ÑÑдок, Ñка знаÑ, Ñк поÑÑвнÑваÑи його елеменÑи. Ðа замовÑÑваннÑм елеменÑи ÑоÑÑÑÑÑÑÑÑ Ñк ÑÑдки.
ÐеÑод arr.sort(fn) ÑеалÑзÑÑ Ð·Ð°Ð³Ð°Ð»Ñний алгоÑиÑм ÑоÑÑÑваннÑ. Ðам не поÑÑÑбно пÑклÑваÑиÑÑ Ð¿Ñо Ñе, Ñк вÑн пÑаÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ (в бÑлÑÑоÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÑв Ñе опÑимÑзоване Ñвидке ÑоÑÑÑÐ²Ð°Ð½Ð½Ñ Ñи Timsort). РеалÑзÑÑÑÑÑÑ Ð¿ÑоÑ
Ñд по маÑивÑ, поÑÑвнÑÑÑÑÑÑ Ð¹Ð¾Ð³Ð¾ елеменÑи за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð½Ð°Ð´Ð°Ð½Ð¾Ñ ÑÑнкÑÑÑ Ñ Ð·Ð¼ÑнÑÑÑÑÑÑ ÑÑ
поÑÑдок. ÐÑе, Ñо залиÑаÑÑÑÑÑ Ð½Ð°Ð¼, Ñе надаÑи fn, Ñка ÑобиÑÑ Ñе поÑÑвнÑннÑ.
Ðо ÑеÑÑ, ÑкÑо ми коли-небÑÐ´Ñ Ð·Ð°Ñ Ð¾Ñемо дÑзнаÑиÑÑ, ÑÐºÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи поÑÑвнÑÑÑÑÑÑ â нÑÑо не Ð·Ð°Ð²Ð°Ð¶Ð°Ñ Ð½Ð°Ð¼ вивеÑÑи ÑÑ Ð½Ð° екÑан:
[1, -2, 15, 2, 0, 8].sort(function(a, b) {
alert( a + " <> " + b );
return a - b;
});
РпÑоÑеÑÑ ÑобоÑи алгоÑиÑм може поÑÑвнÑваÑи ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð· ÑнÑими по кÑлÑка ÑазÑв, але вÑн намагаÑÑÑÑÑ Ð·ÑобиÑи Ñкомога менÑе поÑÑвнÑнÑ.
ÐаÑпÑÐ°Ð²Ð´Ñ Ð²Ñд ÑÑнкÑÑÑ Ð¿Ð¾ÑÑвнÑÐ½Ð½Ñ Ð¿Ð¾ÑÑÑбно бÑдÑ-Ñке позиÑивне ÑиÑло, Ñоб ÑказаÑи «бÑлÑÑе», Ñ Ð½ÐµÐ³Ð°Ñивне ÑиÑло, Ñоб ÑказаÑи «менÑе».
Це дозволÑÑ Ð¿Ð¸ÑаÑи коÑоÑÑÑ ÑÑнкÑÑÑ:
let arr = [ 1, 2, 15 ];
arr.sort(function(a, b) { return a - b; });
alert(arr); // 1, 2, 15
ÐамʼÑÑаÑÑе ÑÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ? Ðожна викоÑиÑÑовÑваÑи ÑÑ ÑÑÑ Ð´Ð»Ñ Ñого, Ñоб ÑоÑÑÑÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð³Ð»Ñдало бÑлÑÑ Ð°ÐºÑÑаÑним:
arr.sort( (a, b) => a - b );
ÐÑаÑÑваÑиме ÑоÑно Ñак, Ñк Ñ Ð´Ð¾Ð²Ñа веÑÑÑÑ Ð²Ð¸Ñе.
localeCompare Ð´Ð»Ñ ÑÑдкÑвÐамʼÑÑаÑÑе алгоÑиÑм поÑÑвнÑÐ½Ð½Ñ ÑÑдкÑв? ÐÑн поÑÑвнÑÑ Ð»ÑÑеÑи за ÑÑ ÐºÐ¾Ð´Ð°Ð¼Ð¸ за замовÑÑваннÑм.
ÐÐ»Ñ Ð±Ð°Ð³Ð°ÑÑоÑ
алÑавÑÑÑв кÑаÑе викоÑиÑÑовÑваÑи меÑод str.localeCompare Ð´Ð»Ñ Ð¿ÑавилÑного ÑоÑÑÑÐ²Ð°Ð½Ð½Ñ Ð»ÑÑеÑ, Ñк напÑиклад Ã.
ÐапÑиклад, давайÑе вÑдÑоÑÑÑÑмо кÑлÑка кÑаÑн нÑмеÑÑÐºÐ¾Ñ Ð¼Ð¾Ð²Ð¾Ñ:
let countries = ['Ãsterreich', 'Andorra', 'Vietnam'];
alert( countries.sort( (a, b) => a > b ? 1 : -1) ); // Andorra, Vietnam, Ãsterreich (не пÑавилÑно)
alert( countries.sort( (a, b) => a.localeCompare(b) ) ); // Andorra,Ãsterreich,Vietnam (пÑавилÑно!)
reverse
ÐеÑод arr.reverse змÑнÑÑ Ð¿Ð¾ÑÑдок елеменÑÑв в arr на звоÑоÑний.
ÐапÑиклад:
let arr = [1, 2, 3, 4, 5];
arr.reverse();
alert( arr ); // 5,4,3,2,1
ÐÑн Ñакож повеÑÑÐ°Ñ Ð¼Ð°Ñив arr Ð·Ñ Ð·Ð¼Ñненим поÑÑдком елеменÑÑв.
split Ñа join
СиÑÑаÑÑÑ Ð· ÑеалÑного жиÑÑÑ. Ðи пиÑемо додаÑок Ð´Ð»Ñ Ð¾Ð±Ð¼ÑÐ½Ñ Ð¿Ð¾Ð²ÑдомленнÑми, Ñ Ð²ÑдвÑдÑÐ²Ð°Ñ Ð²Ð²Ð¾Ð´Ð¸ÑÑ Ñмена ÑÐ¸Ñ , ÐºÐ¾Ð¼Ñ Ð¹Ð¾Ð³Ð¾ вÑдпÑавиÑи, ÑеÑез комÑ: ÐаÑÑ, ÐеÑÑ, ÐаÑа. Ðле нам-Ñо набагаÑо зÑÑÑнÑÑе пÑаÑÑваÑи з маÑивом Ñмен, нÑж з одним ÑÑдком. Як його оÑÑимаÑи?
ÐеÑод str.split(delim) Ñаме Ñе Ñ ÑобиÑÑ. ÐÑн ÑÐ¾Ð·Ð±Ð¸Ð²Ð°Ñ ÑÑдок на маÑив по Ð·Ð°Ð´Ð°Ð½Ð¾Ð¼Ñ ÑоздÑлÑÐ½Ð¸ÐºÑ delim.
У пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð½Ð¸Ð¶Ñе Ñаким ÑоздÑлÑником Ñ ââÑÑдок з коми Ñа пÑопÑÑкÑ.
let names = 'ÐаÑÑ, ÐеÑÑ, ÐаÑа';
let arr = names.split(', ');
for (let name of arr) {
alert( `A message to ${name}.` ); // ÐовÑÐ´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¾ÑÑимаÑÑÑ: ÐаÑÑ (Ñ ÑнÑÑ Ñмена)
}
У меÑÐ¾Ð´Ñ split Ñ Ð½ÐµÐ¾Ð±Ð¾Ð²Ê¼Ñзковий дÑÑгий ÑиÑловий аÑгÑÐ¼ÐµÐ½Ñ â Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° кÑлÑкÑÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв в маÑивÑ. ЯкÑо ÑÑ Ð±ÑлÑÑе, нÑж вказано, Ñо залиÑок маÑÐ¸Ð²Ñ Ð±Ñде вÑдкинÑÑий. Ðа пÑакÑиÑÑ Ñе ÑÑдко викоÑиÑÑовÑÑÑÑÑÑ:
let arr = 'ÐаÑÑ, ÐеÑÑ, ÐаÑа, Ðван'.split(', ', 2);
alert(arr); // ÐаÑÑ, ÐеÑÑ
Ðиклик split(s) з поÑожнÑм аÑгÑменÑом s ÑÐ¾Ð·Ð±Ð¸Ð²Ð°Ñ ÑÑдок на маÑив бÑкв:
let str = "test";
alert( str.split('') ); // t,e,s,t
Ðиклик arr.join(glue) ÑобиÑÑ Ð² ÑоÑноÑÑÑ Ð¿ÑоÑилежне split. ÐÑн ÑÑвоÑÑÑ ÑÑдок з елеменÑÑв arr, вÑÑавлÑÑÑи glue мÑж ними.
ÐапÑиклад:
let arr = ["ÐаÑÑ", "ÐеÑÑ", "ÐаÑа"];
let str = arr.join(';'); // обʼÑднÑÑмо маÑив в ÑÑдок за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ";"
alert( str ); // ÐаÑÑ;ÐеÑÑ;ÐаÑа
reduce/reduceRight
ЯкÑо нам поÑÑÑбно пеÑебÑаÑи маÑив â ми можемо викоÑиÑÑовÑваÑи forEach, for або for..of.
ЯкÑо нам поÑÑÑбно пеÑебÑаÑи маÑив Ñ Ð¿Ð¾Ð²ÐµÑнÑÑи Ð´Ð°Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елеменÑа â ми викоÑиÑÑовÑÑмо map.
ÐеÑоди arr.reduce Ñа arr.reduceRight ÑÑ Ð¾Ð¶Ñ Ð½Ð° меÑоди виÑе, але вони ÑÑÐ¾Ñ Ð¸ ÑкладнÑÑÑ. Ðони викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑиÑÐ»ÐµÐ½Ð½Ñ ÑкогоÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð½Ñ Ð½Ð° оÑÐ½Ð¾Ð²Ñ Ð²ÑÑого маÑивÑ.
СинÑакÑиÑ:
let value = arr.reduce(function(accumulator, item, index, array) {
// ...
}, [initial]);
ФÑнкÑÑÑ Ð·Ð°ÑÑоÑовÑÑÑÑÑÑ Ð¿Ð¾ ÑеÑÐ·Ñ Ð´Ð¾ вÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв маÑÐ¸Ð²Ñ Ñ Â«Ð¿ÐµÑеноÑиÑÑ» ÑвÑй ÑезÑлÑÑÐ°Ñ Ð½Ð° наÑÑÑпний виклик.
ÐÑгÑменÑи:
accumulatorâ ÑезÑлÑÑÐ°Ñ Ð¿Ð¾Ð¿ÐµÑеднÑого Ð²Ð¸ÐºÐ»Ð¸ÐºÑ ÑÑÑÑ ÑÑнкÑÑÑ, доÑÑвнÑÑinitialпÑи пеÑÑÐ¾Ð¼Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ (ÑкÑо пеÑеданийinitial),itemâ ÑеÑговий ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑивÑ,indexâ його ÑндекÑ,arrayâ Ñам маÑив.
ÐÑи Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÑÑнкÑÑÑ ÑезÑлÑÑÐ°Ñ ÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð½Ð° попеÑеднÑÐ¾Ð¼Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑ Ð¼Ð°ÑÐ¸Ð²Ñ Ð¿ÐµÑедаÑÑÑÑÑ Ñк пеÑÑий аÑгÑменÑ.
ÐÑозÑмÑÑи пÑоÑÑÑÑе, ÑкÑо дÑмаÑи пÑо пеÑÑий аÑгÑÐ¼ÐµÐ½Ñ Ñк «збиÑаÑ» ÑезÑлÑÑаÑÑв попеÑеднÑÑ
викликÑв ÑÑнкÑÑÑ. ÐÑÑÐ»Ñ Ð·Ð°ÐºÑнÑÐµÐ½Ð½Ñ Ð²Ñн ÑÑÐ°Ñ ÑезÑлÑÑаÑом reduce.
ÐвÑÑиÑÑ Ñкладно?
Цей меÑод найпÑоÑÑÑÑе зÑозÑмÑÑи на пÑикладÑ.
ТÑÑ Ð¼Ð¸ оÑÑимаÑмо ÑÑÐ¼Ñ Ð²ÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв маÑÐ¸Ð²Ñ Ð»Ð¸Ñе одним ÑÑдком:
let arr = [1, 2, 3, 4, 5];
let result = arr.reduce((sum, current) => sum + current, 0);
alert(result); // 15
ТÑÑ Ð¼Ð¸ викоÑиÑÑовÑвали найбÑлÑÑ Ð¿Ð¾ÑиÑений ваÑÑÐ°Ð½Ñ reduce, Ñкий викоÑиÑÑовÑÑ ÑÑлÑки 2 аÑгÑменÑи.
ÐавайÑе деÑалÑнÑÑе ÑозбеÑемо, Ñк вÑн пÑаÑÑÑ.
- ÐÑи пеÑÑÐ¾Ð¼Ñ Ð·Ð°Ð¿ÑÑкÑ
sumдоÑÑвнÑÑinitial(оÑÑаннÑй аÑгÑменÑreduce), ÑобÑо0, аcurrentâ пеÑÑий ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑивÑ, ÑÑвний1. Таким Ñином, ÑезÑлÑÑÐ°Ñ ÑÑнкÑÑÑ Ð´Ð¾ÑÑвнÑÑ1. - ÐÑи дÑÑÐ³Ð¾Ð¼Ñ Ð·Ð°Ð¿ÑÑкÑ
sum = 1, Ñ Ð´Ð¾ нÑого ми додаÑмо дÑÑгий ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÐ¸Ð²Ñ (2). - ÐÑи ÑÑеÑÑÐ¾Ð¼Ñ Ð·Ð°Ð¿ÑÑкÑ
sum = 3, до Ñкого ми додаÑмо наÑÑÑпний елеменÑ, Ñ Ñак далÑâ¦
ÐоÑÑк обÑиÑÐ»ÐµÐ½Ñ Ð²Ð¸Ñ Ð¾Ð´Ð¸ÑÑ Ñакий:
У виглÑÐ´Ñ ÑаблиÑÑ, де кожен ÑÑдок â виклик ÑÑнкÑÑÑ Ð½Ð° ÑеÑÐ³Ð¾Ð²Ð¾Ð¼Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑ Ð¼Ð°ÑивÑ:
sum |
current |
ÑезÑлÑÑÐ°Ñ | |
|---|---|---|---|
| пеÑÑий виклик | 0 |
1 |
1 |
| дÑÑгий виклик | 1 |
2 |
3 |
| ÑÑеÑÑй виклик | 3 |
3 |
6 |
| ÑеÑвеÑÑий виклик | 6 |
4 |
10 |
| пʼÑÑий виклик | 10 |
5 |
15 |
ТÑÑ ÑÑÑко видно, Ñк ÑезÑлÑÑÐ°Ñ Ð¿Ð¾Ð¿ÐµÑеднÑого Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð¿ÐµÑедаÑÑÑÑÑ Ð² пеÑÑий аÑгÑÐ¼ÐµÐ½Ñ Ð½Ð°ÑÑÑпного.
Ðи Ñакож можемо опÑÑÑиÑи поÑаÑкове знаÑеннÑ:
let arr = [1, 2, 3, 4, 5];
// пÑибÑано поÑаÑкове знаÑÐµÐ½Ð½Ñ (Ð½ÐµÐ¼Ð°Ñ 0 в кÑнÑÑ)
let result = arr.reduce((sum, current) => sum + current);
alert( result ); // 15
РезÑлÑÑÐ°Ñ Ñой Ñамий. Це ÑомÑ, Ñо пÑи вÑдÑÑÑноÑÑÑ initial в ÑкоÑÑÑ Ð¿ÐµÑÑого знаÑÐµÐ½Ð½Ñ Ð±ÐµÑеÑÑÑÑ Ð¿ÐµÑÑий ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑивÑ, а пеÑебÑÑ ÑÑаÑÑÑÑ Ð· дÑÑгого.
ТаблиÑÑ ÑозÑÐ°Ñ ÑнкÑв Ñака ж, Ñк Ñ Ð²Ð¸Ñе, без пеÑÑого ÑÑдка.
Ðле Ñаке викоÑиÑÑÐ°Ð½Ð½Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ ÐºÑайнÑÐ¾Ñ Ð¾Ð±ÐµÑежноÑÑÑ. ЯкÑо маÑив поÑожнÑй, Ñо виклик reduce без поÑаÑкового знаÑÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°ÑÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ.
ÐÑÑ Ð¿Ñиклад:
let arr = [];
// Error: Reduce of empty array with no initial value
// Ñкби ÑÑнÑвало поÑаÑкове знаÑеннÑ, reduce повеÑнÑв би його Ð´Ð»Ñ Ð¿Ð¾ÑожнÑого маÑивÑ.
arr.reduce((sum, current) => sum + current);
Ð¢Ð¾Ð¼Ñ ÑекомендÑÑÑÑÑÑ Ð·Ð°Ð²Ð¶Ð´Ð¸ вказÑваÑи поÑаÑкове знаÑеннÑ.
ÐеÑод arr.reduceRight пÑаÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³ÑÑно, але пÑÐ¾Ñ Ð¾Ð´Ð¸ÑÑ Ð¿Ð¾ маÑÐ¸Ð²Ñ ÑпÑава налÑво.
Array.isArray
ÐаÑиви не маÑÑÑ Ð¾ÐºÑемого ÑÐ¸Ð¿Ñ Ð² Javascript. Ðони заÑÐ½Ð¾Ð²Ð°Ð½Ñ Ð½Ð° обʼÑкÑÐ°Ñ .
Ð¢Ð¾Ð¼Ñ typeof не може вÑдÑÑзниÑи пÑоÑÑий обʼÑÐºÑ Ð²Ñд маÑивÑ:
alert(typeof {}); // обʼÑкÑ
alert(typeof []); // Ñакож обʼÑкÑ
â¦Ðле маÑиви викоÑиÑÑовÑÑÑÑÑÑ Ð½Ð°ÑÑÑлÑки ÑаÑÑо, Ñо Ð´Ð»Ñ ÑÑого пÑидÑмали ÑпеÑÑалÑний меÑод: Array.isArray(value). ÐÑн повеÑÑÐ°Ñ true, ÑкÑо value â Ñе маÑив, ÑнакÑе false.
alert(Array.isArray({})); // false
alert(Array.isArray([])); // true
ÐÑлÑÑÑÑÑÑ Ð¼ÐµÑодÑв пÑдÑÑимÑÑÑÑ âthisArgâ
Ðайже вÑÑ Ð¼ÐµÑоди маÑивÑ, ÑÐºÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑ ÑÑнкÑÑÑ â ÑÐ°ÐºÑ Ñк find, filter, map, за винÑÑком меÑÐ¾Ð´Ñ sort, пÑиймаÑÑÑ Ð½ÐµÐ¾Ð±Ð¾Ð²Ê¼Ñзковий паÑамеÑÑ thisArg.
Цей паÑамеÑÑ Ð½Ðµ поÑÑнÑвавÑÑ Ð²Ð¸Ñе, оÑкÑлÑки дÑже ÑÑдко викоÑиÑÑовÑÑÑÑÑÑ, але Ð´Ð»Ñ ÐºÑаÑого ÑозÑмÑÐ½Ð½Ñ Ñеми ми зобовʼÑÐ·Ð°Ð½Ñ Ð¹Ð¾Ð³Ð¾ ÑозглÑнÑÑи.
ÐÑÑ Ð¿Ð¾Ð²Ð½Ð¸Ð¹ ÑинÑакÑÐ¸Ñ ÑÐ¸Ñ Ð¼ÐµÑодÑв:
arr.find(func, thisArg);
arr.filter(func, thisArg);
arr.map(func, thisArg);
// ...
// thisArg - Ñе необовʼÑзковий оÑÑаннÑй аÑгÑменÑ
ÐнаÑÐµÐ½Ð½Ñ Ð¿Ð°ÑамеÑÑа thisArg ÑÑÐ°Ñ this Ð´Ð»Ñ func.
ÐапÑиклад, оÑÑ ÑÑÑ Ð¼Ð¸ викоÑиÑÑовÑÑмо меÑод обʼÑкÑа army Ñк ÑÑлÑÑÑ, Ñ thisArg пеÑÐµÐ´Ð°Ñ Ð¹Ð¾Ð¼Ñ ÐºÐ¾Ð½ÑекÑÑ:
let army = {
minAge: 18,
maxAge: 27,
canJoin(user) {
return user.age >= this.minAge && user.age < this.maxAge;
}
};
let users = [
{age: 16},
{age: 20},
{age: 23},
{age: 30}
];
// знайÑи коÑиÑÑÑваÑÑв, Ð´Ð»Ñ ÑкиÑ
army.canJoin повеÑÑÐ°Ñ true
let soldiers = users.filter(army.canJoin, army);
alert(soldiers.length); // 2
alert(soldiers[0].age); // 20
alert(soldiers[1].age); // 23
Якби ми в пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð²Ð¸Ñе викоÑиÑÑовÑвали пÑоÑÑо users.filter(army.canJoin), Ñо виклик army.canJoin бÑв би в ÑÐµÐ¶Ð¸Ð¼Ñ Ð¾ÐºÑÐµÐ¼Ð¾Ñ ÑÑнкÑÑÑ, з this=undefined. Це пÑизвело б до помилки.
Ðиклик users.filter(army.canJoin, army) можна замÑниÑи на users.filter(user => army.canJoin(user)), Ñкий ÑобиÑÑ Ñе ж Ñаме. ÐÑÑаннÑй Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ Ð½Ð°Ð²ÑÑÑ ÑаÑÑÑÑе, оÑкÑлÑки ÑÑÑÑлоÑна ÑÑнкÑÑÑ Ð±ÑлÑÑ Ð½Ð°Ð¾Ñна.
ÐÑдÑÑмки
ШпаÑгалка по меÑодам маÑивÑ:
-
ÐÐ»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ/Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв:
push(... items)â Ð´Ð¾Ð´Ð°Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи до кÑнÑÑ,arr.pop()â дÑÑÑÐ°Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð· кÑнÑÑ,arr.shift()â дÑÑÑÐ°Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð· поÑаÑкÑ,arr.unshift(...items)â Ð´Ð¾Ð´Ð°Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи в поÑаÑок.splice(pos, deleteCount, ...items)â поÑинаÑÑи з ÑндекÑÑpos, видалÑÑdeleteCountелеменÑÑв Ñа вÑÑавлÑÑitems.slice(start, end)â ÑÑвоÑÑÑ Ð½Ð¾Ð²Ð¸Ð¹ маÑив, копÑÑÑÑи в нÑого елеменÑи з позиÑÑÑstartдоend(не вклÑÑаÑÑиend).concat(...items)â повеÑÑÐ°Ñ Ð½Ð¾Ð²Ð¸Ð¹ маÑив: копÑÑÑ Ð²ÑÑ Ñлени поÑоÑного маÑÐ¸Ð²Ñ Ñ Ð´Ð¾Ð´Ð°Ñ Ð´Ð¾ нÑогоitems. ЯкÑо ÑкийÑÑ ÑзitemsÑ Ð¼Ð°Ñивом, ÑÐ¾Ð´Ñ Ð±ÐµÑÑÑÑÑÑ Ð¹Ð¾Ð³Ð¾ елеменÑи.
-
ÐÐ»Ñ Ð¿Ð¾ÑÑÐºÑ ÑеÑед елеменÑÑв:
indexOf/lastIndexOf(item, pos)â ÑÑкаÑitem, поÑинаÑÑи з позиÑÑÑpos, Ñ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ Ð¹Ð¾Ð³Ð¾ ÑÐ½Ð´ÐµÐºÑ Ð°Ð±Ð¾-1, ÑкÑо нÑÑого не знайдено.includes(value)â повеÑÑаÑtrue, ÑкÑо в маÑÐ¸Ð²Ñ Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñvalue, в ÑнÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑfalse.find/filter(func)â ÑÑлÑÑÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи ÑеÑез ÑÑнкÑÑÑ Ñ Ð²ÑддаÑÑÑÑÑ Ð¿ÐµÑÑе/вÑÑ Ð·Ð½Ð°ÑеннÑ, пÑи пÑÐ¾Ñ Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÑÐºÐ¸Ñ ÑÑнкÑÑÑ Ð¿Ð¾Ð²ÐµÑÑаÑtrue.findIndexÑÑ Ð¾Ð¶Ð¸Ð¹ наfind, але повеÑÑÐ°Ñ ÑÐ½Ð´ÐµÐºÑ Ð·Ð°Ð¼ÑÑÑÑ Ð·Ð½Ð°ÑеннÑ.
-
ÐÐ»Ñ Ð¿ÐµÑебоÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв:
forEach(func)â викликаÑfuncÐ´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елеменÑа. ÐÑÑого не повеÑÑаÑ.
-
ÐÐ»Ñ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ Ð¼Ð°ÑивÑ:
map(func)â ÑÑвоÑÑÑ Ð½Ð¾Ð²Ð¸Ð¹ маÑив з ÑезÑлÑÑаÑÑв викликÑfuncÐ´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елеменÑа.sort(func)â ÑоÑÑÑÑ Ð¼Ð°Ñив «на мÑÑÑÑ», а поÑÑм повеÑÑÐ°Ñ Ð¹Ð¾Ð³Ð¾.reverse()â «на мÑÑÑÑ» змÑнÑÑ Ð¿Ð¾ÑÑдок елеменÑÑв на пÑоÑилежний Ñ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ Ð·Ð¼Ñнений маÑив.split/joinâ пеÑеÑвоÑÑÑ ÑÑдок в маÑив Ñ Ð½Ð°Ð·Ð°Ð´.reduce(func, initial)â обÑиÑлÑÑ Ð¾Ð´Ð½Ðµ знаÑÐµÐ½Ð½Ñ Ð½Ð° оÑÐ½Ð¾Ð²Ñ Ð²ÑÑого маÑивÑ, викликаÑÑиfuncÐ´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елеменÑа Ñ Ð¿ÐµÑедаÑÑи пÑомÑжний ÑезÑлÑÑÐ°Ñ Ð¼Ñж викликами.
-
ÐодаÑково:
Array.isArray(value)пеÑевÑÑÑÑ, Ñи ÑvalueмаÑивом, ÑкÑо Ñак, повеÑÑаÑtrue, ÑнакÑеfalse.
ÐвеÑнÑÑÑ ÑвагÑ, Ñо меÑоди sort, reverse Ñа splice змÑнÑÑÑÑ Ð¿Ð¾ÑоÑний маÑив.
ÐивÑÐµÐ½Ð¸Ñ Ð½Ð°Ð¼Ð¸ меÑодÑв доÑиÑÑ Ð² 99% випадкÑв, але ÑÑнÑÑÑÑ Ñ ÑнÑÑ.
- arr.some(fn)/arr.every(fn) пеÑевÑÑÑÑÑÑ Ð¼Ð°Ñив.
ФÑнкÑÑÑ fn викликаÑÑÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елеменÑа маÑивÑ, подÑбного до map. ЯкÑо бÑдÑ-ÑкÑ/ÑÑÑ ÑезÑлÑÑаÑи Ñ true, повеÑÑÐ°Ñ true, ÑнакÑе false.
Ð¦Ñ Ð¼ÐµÑоди поводÑÑÑÑÑ Ð¿Ñиблизно Ñк опеÑаÑоÑи || Ñа &&. ЯкÑо fn повеÑÑÐ°Ñ ÑÑÑинне знаÑеннÑ, arr.some() негайно повеÑÑÐ°Ñ true Ñ Ð¿ÑипинÑÑ ÑÑеÑаÑÑÑ Ð¿Ð¾ ÑеÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв. ЯкÑо fn повеÑÑÐ°Ñ Ñ
ибне знаÑеннÑ, arr.every() негайно повеÑÑÐ°Ñ false Ñ Ð¿ÑипинÑÑ ÑÑеÑаÑÑÑ Ð¿Ð¾ ÑеÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв.
Ðи можемо викоÑиÑÑовÑваÑи every Ð´Ð»Ñ Ð¿Ð¾ÑÑвнÑÐ½Ð½Ñ Ð¼Ð°ÑивÑв:
function arraysEqual(arr1, arr2) {
return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
}
alert( arraysEqual([1, 2], [1, 2])); // true
-
arr.fill(value, start, end) â заповнÑÑ Ð¼Ð°Ñив повÑоÑÑваними
value, поÑинаÑÑи з ÑндекÑÑstartдоend. -
arr.copyWithin(target, start, end) â копÑÑÑ ÑÐ²Ð¾Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи, поÑинаÑÑи з
startÑ Ð·Ð°ÐºÑнÑÑÑÑиend, в влаÑÐ½Ñ Ð¿Ð¾Ð·Ð¸ÑÑÑtarget(пеÑезапиÑÑÑ ÑÑнÑÑÑÑ). -
arr.flat(depth)/arr.flatMap(fn) â ÑÑвоÑÑÑ Ð½Ð¾Ð²Ð¸Ð¹, плоÑкий маÑив з багаÑовимÑÑного маÑивÑ.
Ðовний ÑпиÑок Ñ Ð² довÑÐ´Ð½Ð¸ÐºÑ MDN.
Ðа пеÑÑий поглÑд, може здаÑиÑÑ, Ñо ÑÑнÑÑ Ð´Ñже багаÑо ÑÑÐ·Ð½Ð¸Ñ Ð¼ÐµÑодÑв, ÑÐºÑ Ð´Ð¾ÑиÑÑ Ñкладно запамʼÑÑаÑи. Ðле Ñе ÑÑлÑки Ñак здаÑÑÑÑÑ.
Уважно вивÑÑÑÑ ÑпаÑгалкÑ, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð²Ð¸Ñе, а поÑÑм, Ñоб попÑакÑикÑваÑиÑÑ, виÑÑÑиÑе завданнÑ, запÑÐ¾Ð¿Ð¾Ð½Ð¾Ð²Ð°Ð½Ñ Ð² ÑÑÐ¾Ð¼Ñ ÑоздÑлÑ. Так ви оÑÑимаÑÑе Ð½ÐµÐ¾Ð±Ñ Ñдний доÑвÑд в пÑавилÑÐ½Ð¾Ð¼Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑÐ°Ð½Ð½Ñ Ð¼ÐµÑодÑв маÑивÑ.
Ðожного ÑазÑ, коли вам бÑде Ð½ÐµÐ¾Ð±Ñ Ñдно ÑоÑÑ Ð·ÑобиÑи з маÑивом, а ви не знаÑÑе, Ñк Ñе зÑобиÑи â пÑÐ¸Ñ Ð¾Ð´ÑÑе ÑÑди, дивÑÑÑÑÑ Ð½Ð° ÑаблиÑÑ Ñ ÑÑкайÑе пÑавилÑний меÑод. ÐÑиклади допоможÑÑÑ Ð²Ð°Ð¼ вÑе зÑобиÑи пÑавилÑно, Ñ Ð½ÐµÐ·Ð°Ð±Ð°Ñом ви Ñвидко запамʼÑÑайÑе меÑоди без оÑÐ¾Ð±Ð»Ð¸Ð²Ð¸Ñ Ð·ÑÑилÑ.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)