ÐаÑÑÐ¸Ð²Ñ Ð¿ÑедоÑÑавлÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво меÑодов. ЧÑÐ¾Ð±Ñ Ð±Ñло пÑоÑе, в ÑÑой главе они ÑазбиÑÑ Ð½Ð° гÑÑппÑ.
Ðобавление/Ñдаление ÑлеменÑов
ÐÑ Ñже знаем меÑодÑ, коÑоÑÑе добавлÑÑÑ Ð¸ ÑдалÑÑÑ ÑлеменÑÑ Ð¸Ð· наÑала или конÑа:
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
ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ð±Ñл ÑдалÑн, но в маÑÑиве вÑÑ ÐµÑÑ ÑÑи ÑлеменÑа, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑвидеÑÑ, ÑÑо arr.length == 3.
ÐÑо еÑÑеÑÑвенно, поÑÐ¾Ð¼Ñ ÑÑо delete obj.key ÑдалÑÐµÑ Ð·Ð½Ð°Ñение по клÑÑÑ key. ÐÑо вÑÑ, ÑÑо он делаеÑ. ХоÑоÑо Ð´Ð»Ñ Ð¾Ð±ÑекÑов. Ðо Ð´Ð»Ñ Ð¼Ð°ÑÑивов Ð¼Ñ Ð¾Ð±ÑÑно Ñ
оÑим, ÑÑÐ¾Ð±Ñ Ð¾ÑÑавÑиеÑÑ ÑлеменÑÑ ÑдвинÑлиÑÑ Ð¸ занÑли оÑвободивÑееÑÑ Ð¼ÐµÑÑо. ÐÑ Ð¶Ð´Ñм, ÑÑо маÑÑив ÑÑÐ°Ð½ÐµÑ ÐºÐ¾ÑоÑе.
ÐоÑÑÐ¾Ð¼Ñ Ð½Ñжно иÑполÑзоваÑÑ ÑпеÑиалÑнÑе меÑодÑ.
ÐеÑод arr.splice â ÑÑо ÑнивеÑÑалÑнÑй «ÑвейÑаÑÑкий нож» Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¼Ð°ÑÑивами. Ð£Ð¼ÐµÐµÑ Ð²ÑÑ: добавлÑÑÑ, ÑдалÑÑÑ Ð¸ заменÑÑÑ ÑлеменÑÑ.
СинÑакÑиÑ:
arr.splice(start[, deleteCount, elem1, ..., elemN])
Ðн изменÑÐµÑ arr наÑÐ¸Ð½Ð°Ñ Ñ Ð¸Ð½Ð´ÐµÐºÑа start: ÑдалÑÐµÑ deleteCount ÑлеменÑов и заÑем вÑÑавлÑÐµÑ elem1, ..., elemN на иÑ
меÑÑо. ÐозвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив из ÑдалÑннÑÑ
ÑлеменÑов.
ÐÑÐ¾Ñ Ð¼ÐµÑод легко понÑÑÑ, ÑаÑÑмоÑÑев пÑимеÑÑ.
ÐаÑнÑм Ñ ÑдалениÑ:
let arr = ["Я", "изÑÑаÑ", "JavaScript"];
arr.splice(1, 1); // наÑÐ¸Ð½Ð°Ñ Ñ Ð¸Ð½Ð´ÐµÐºÑа 1, ÑдалиÑÑ 1 ÑлеменÑ
alert( arr ); // оÑÑалоÑÑ ["Я", "JavaScript"]
Ðегко, пÑавда? ÐаÑÐ¸Ð½Ð°Ñ Ñ Ð¸Ð½Ð´ÐµÐºÑа 1, он ÑбÑал 1 ÑлеменÑ.
Ð ÑледÑÑÑем пÑимеÑе Ð¼Ñ Ñдалим 3 ÑлеменÑа и заменим Ð¸Ñ Ð´Ð²ÑÐ¼Ñ Ð´ÑÑгими.
let arr = ["Я", "изÑÑаÑ", "JavaScript", "пÑÑмо", "ÑейÑаÑ"];
// ÑдалиÑÑ 3 пеÑвÑÑ
ÑлеменÑа и замениÑÑ Ð¸Ñ
дÑÑгими
arr.splice(0, 3, "Ðавай", "ÑанÑеваÑÑ");
alert( arr ) // ÑепеÑÑ ["Ðавай", "ÑанÑеваÑÑ", "пÑÑмо", "ÑейÑаÑ"]
ÐдеÑÑ Ð²Ð¸Ð´Ð½Ð¾, ÑÑо splice возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив из ÑдалÑннÑÑ
ÑлеменÑов:
let arr = ["Я", "изÑÑаÑ", "JavaScript", "пÑÑмо", "ÑейÑаÑ"];
// ÑдалиÑÑ 2 пеÑвÑÑ
ÑлеменÑа
let removed = arr.splice(0, 2);
alert( removed ); // "Я", "изÑÑаÑ" <-- маÑÑив из ÑдалÑннÑÑ
ÑлеменÑов
ÐеÑод splice Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑавлÑÑÑ ÑлеменÑÑ Ð±ÐµÐ· ÑдалениÑ, Ð´Ð»Ñ ÑÑого доÑÑаÑоÑно ÑÑÑановиÑÑ deleteCount в 0:
let arr = ["Я", "изÑÑаÑ", "JavaScript"];
// Ñ Ð¸Ð½Ð´ÐµÐºÑа 2
// ÑдалиÑÑ 0 ÑлеменÑов
// вÑÑавиÑÑ "ÑложнÑй", "ÑзÑк"
arr.splice(2, 0, "ÑложнÑй", "ÑзÑк");
alert( arr ); // "Я", "изÑÑаÑ", "ÑложнÑй", "ÑзÑк", "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: "ÑÑо-Ñо",
length: 1
};
alert( arr.concat(arrayLike) ); // 1,2,[object Object]
â¦Ðо еÑли маÑÑивоподобнÑй обÑÐµÐºÑ Ð¸Ð¼ÐµÐµÑ ÑпеÑиалÑное ÑвойÑÑво Symbol.isConcatSpreadable, Ñо он обÑабаÑÑваеÑÑÑ ÐºÐ°Ðº маÑÑив, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ concat: вмеÑÑо него добавлÑÑÑÑÑ ÐµÐ³Ð¾ ÑлеменÑÑ:
let arr = [1, 2];
let arrayLike = {
0: "ÑÑо-Ñо",
1: "еÑÑ",
[Symbol.isConcatSpreadable]: true,
length: 2
};
alert( arr.concat(arrayLike) ); // 1,2,ÑÑо-Ñо,еÑÑ
ÐеÑебоÑ: forEach
ÐеÑод arr.forEach позволÑÐµÑ Ð·Ð°Ð¿ÑÑкаÑÑ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа маÑÑива.
СинÑакÑиÑ:
arr.forEach(function(item, index, array) {
// ... делаÑÑ ÑÑо-Ñо Ñ item
});
ÐапÑимеÑ, ÑÑÐ¾Ñ ÐºÐ¾Ð´ вÑÐ²ÐµÐ´ÐµÑ Ð½Ð° ÑкÑан каждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива:
// ÐÑзов alert Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа
["ÐилÑбо", "ÐÑндалÑÑ", "ÐазгÑл"].forEach(alert);
Ð ÑÑÐ¾Ñ Ð²Ð´Ð¾Ð±Ð°Ð²Ð¾Ðº ÑаÑÑÐºÐ°Ð¶ÐµÑ Ð¸ о позиÑии ÑлеменÑа в Ñелевом маÑÑиве:
["ÐилÑбо", "ÐÑндалÑÑ", "ÐазгÑл"].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
ÐожалÑйÑÑа, обÑаÑиÑе внимание, ÑÑо меÑÐ¾Ð´Ñ Ð¸ÑполÑзÑÑÑ ÑÑÑогое ÑÑавнение ===. Таким обÑазом, еÑли Ð¼Ñ Ð¸Ñем false, он наÑ
Ð¾Ð´Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ false, а не нолÑ.
ÐÑли Ð¼Ñ Ñ
оÑим пÑовеÑиÑÑ Ð½Ð°Ð»Ð¸Ñие ÑлеменÑа в маÑÑиве и Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи знаÑÑ ÐµÐ³Ð¾ индекÑ, пÑедпоÑÑиÑелÑно иÑполÑзоваÑÑ arr.includes.
ÐеÑод arr.lastIndexOf поÑ
ож на indexOf, но иÑÐµÑ ÑпÑава налево.
let fruits = ['Яблоко', 'ÐпелÑÑин', 'Яблоко']
alert( fruits.indexOf('Яблоко') ); // 0 (пеÑвÑй 'Яблоко')
alert( fruits.lastIndexOf('Яблоко') ); // 2 (поÑледний 'Яблоко')
includes пÑавилÑно обÑабаÑÑÐ²Ð°ÐµÑ NaNÐезнаÑиÑелÑнаÑ, но заÑлÑживаÑÑÐ°Ñ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¾ÑобенноÑÑÑ includes â он пÑавилÑно обÑабаÑÑÐ²Ð°ÐµÑ NaN, в оÑлиÑие Ð¾Ñ indexOf:
const arr = [NaN];
alert( arr.indexOf(NaN) ); // -1 (невеÑно, должен бÑÑÑ 0)
alert( arr.includes(NaN) );// true (веÑно)
ÐÑо ÑвÑзано Ñ Ñем, ÑÑо includes бÑл добавлен в JavaScript гоÑаздо позже и иÑполÑзÑÐµÑ Ð±Ð¾Ð»ÐµÐµ ÑовÑеменнÑй алгоÑиÑм ÑÑавнениÑ.
find и findIndex/findLastIndex
ÐÑедÑÑавÑÑе, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¼Ð°ÑÑив обÑекÑов. Ðак нам найÑи обÑÐµÐºÑ Ñ Ð¾Ð¿ÑеделÑннÑм ÑÑловием?
ÐдеÑÑ Ð¿ÑигодиÑÑÑ Ð¼ÐµÑод arr.find.
СинÑакÑиÑ:
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: "ÐаÑÑ"},
{id: 2, name: "ÐеÑÑ"},
{id: 3, name: "ÐаÑа"}
];
let user = users.find(item => item.id == 1);
alert(user.name); // ÐаÑÑ
Ð ÑеалÑной жизни маÑÑÐ¸Ð²Ñ Ð¾Ð±ÑекÑов â обÑÑное дело, поÑÑÐ¾Ð¼Ñ Ð¼ÐµÑод find кÑайне полезен.
ÐбÑаÑиÑе внимание, ÑÑо в данном пÑимеÑе Ð¼Ñ Ð¿ÐµÑедаÑм find ÑÑнкÑÐ¸Ñ item => item.id == 1 Ñ Ð¾Ð´Ð½Ð¸Ð¼ аÑгÑменÑом. ÐÑо ÑипиÑно, дÑÑгие аÑгÑменÑÑ ÑÑой ÑÑнкÑии иÑполÑзÑÑÑÑÑ Ñедко.
У меÑода arr.findIndex Ñакой же ÑинÑакÑиÑ, но он возвÑаÑÐ°ÐµÑ Ð¸Ð½Ð´ÐµÐºÑ, на коÑоÑом бÑл найден ÑлеменÑ, а не Ñам ÑлеменÑ. ÐнаÑение -1 возвÑаÑаеÑÑÑ, еÑли ниÑего не найдено.
ÐеÑод arr.findLastIndex поÑ
ож на findIndex, но иÑÐµÑ ÑпÑава налево, наподобие lastIndexOf.
ÐапÑимеÑ:
let users = [
{id: 1, name: "ÐаÑÑ"},
{id: 2, name: "ÐеÑÑ"},
{id: 3, name: "ÐаÑа"},
{id: 4, name: "ÐаÑÑ"}
];
// ÐайÑи Ð¸Ð½Ð´ÐµÐºÑ Ð¿ÐµÑвого ÐаÑи
alert(users.findIndex(user => user.name == 'ÐаÑÑ')); // 0
// ÐайÑи Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ñледнего ÐаÑи
alert(users.findLastIndex(user => user.name == 'ÐаÑÑ')); // 3
filter
ÐеÑод find иÑÐµÑ Ð¾Ð´Ð¸Ð½ (пеÑвÑй) ÑлеменÑ, коÑоÑÑй заÑÑÐ°Ð²Ð¸Ñ ÑÑнкÑÐ¸Ñ Ð²ÐµÑнÑÑÑ true.
ÐÑли найденнÑÑ ÑлеменÑов Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾, можно иÑполÑзоваÑÑ arr.filter(fn).
СинÑакÑÐ¸Ñ ÑÑ
ож Ñ find, но filter возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив из вÑеÑ
подÑ
одÑÑиÑ
ÑлеменÑов:
let results = arr.filter(function(item, index, array) {
// еÑли `true` -- ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑеÑÑÑ Ðº results и пеÑÐµÐ±Ð¾Ñ Ð¿ÑодолжаеÑÑÑ
// возвÑаÑаеÑÑÑ Ð¿ÑÑÑой маÑÑив в ÑлÑÑае, еÑли ниÑего не найдено
});
ÐапÑимеÑ:
let users = [
{id: 1, name: "ÐаÑÑ"},
{id: 2, name: "ÐеÑÑ"},
{id: 3, name: "ÐаÑа"}
];
// возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив, ÑоÑÑоÑÑий из двÑÑ
пеÑвÑÑ
полÑзоваÑелей
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 = ["ÐилÑбо", "ÐÑндалÑÑ", "ÐазгÑл"].map(item => item.length);
alert(lengths); // 6,8,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( `СообÑение полÑÑаÑ: ${name}.` ); // СообÑение полÑÑаÑ: ÐаÑÑ (и дÑÑгие имена)
}
У меÑода split еÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑй вÑоÑой ÑиÑловой аÑгÑÐ¼ÐµÐ½Ñ â огÑаниÑение на колиÑеÑÑво ÑлеменÑов в маÑÑиве. ÐÑли иÑ
болÑÑе, Ñем Ñказано, Ñо оÑÑаÑок маÑÑива бÑÐ´ÐµÑ Ð¾ÑбÑоÑен. Ðа пÑакÑике ÑÑо Ñедко иÑполÑзÑеÑÑÑ:
let arr = 'ÐаÑÑ, ÐеÑÑ, ÐаÑа, СаÑа'.split(', ', 2);
alert(arr); // ÐаÑÑ, ÐеÑÑ
ÐÑзов split(s) Ñ Ð¿ÑÑÑÑм аÑгÑменÑом s Ñазбил Ð±Ñ ÑÑÑÐ¾ÐºÑ Ð½Ð° маÑÑив бÑкв:
let str = "ÑеÑÑ";
alert( str.split('') ); // Ñ,е,Ñ,Ñ
ÐÑзов 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, иÑполÑзÑÐµÑ ÑолÑко два аÑгÑменÑа, ÑÑого обÑÑно доÑÑаÑоÑно.
РазбеÑÑм деÑалÑно как ÑÑо ÑабоÑаеÑ.
- ÐÑи пеÑвом запÑÑке
sumÑавенinitial(поÑледний аÑгÑменÑreduce), Ñо еÑÑÑ0, аcurrentâ пеÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива, ÑавнÑй1. Таким обÑазом, ÑезÑлÑÑÐ°Ñ ÑÑнкÑии Ñавен1. - ÐÑи вÑоÑом запÑÑке
sum = 1, к Ð½ÐµÐ¼Ñ Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñем вÑоÑой ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива (2) и возвÑаÑаем. - ÐÑи ÑÑеÑÑем запÑÑке
sum = 3, к коÑоÑÐ¾Ð¼Ñ Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñем ÑледÑÑÑий ÑлеменÑ, и Ñак далееâ¦
ÐоÑок вÑÑиÑлений полÑÑаеÑÑÑ Ñакой:
Ðли в виде ÑаблиÑÑ, где ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑÑока показÑÐ²Ð°ÐµÑ Ð²Ñзов ÑÑнкÑии на оÑеÑедном ÑлеменÑе маÑÑива:
sum |
current |
result |
|
|---|---|---|---|
| пеÑвÑй вÑзов | 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
ÐаÑÑÐ¸Ð²Ñ Ð½Ðµ обÑазÑÑÑ Ð¾ÑделÑнÑй Ñип даннÑÑ . Ðни оÑÐ½Ð¾Ð²Ð°Ð½Ñ Ð½Ð° обÑекÑÐ°Ñ .
ÐоÑÑÐ¾Ð¼Ñ typeof не Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑиÑÑ Ð¿ÑоÑÑой обÑÐµÐºÑ Ð¾Ñ Ð¼Ð°ÑÑива:
alert(typeof {}); // object
alert(typeof []); // Ñоже object
â¦Ðо маÑÑÐ¸Ð²Ñ Ð¸ÑполÑзÑÑÑÑÑ Ð½Ð°ÑÑолÑко ÑаÑÑо, ÑÑо Ð´Ð»Ñ ÑÑого пÑидÑмали ÑпеÑиалÑнÑй меÑод: 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)â добавлÑÐµÑ ÑлеменÑÑ Ð² конеÑ,pop()â Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ÐºÐ¾Ð½Ñа,shift()â Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ Ð½Ð°Ñала,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/reduceRight(func, initial)â вÑÑиÑлÑÐµÑ Ð¾Ð´Ð½Ð¾ знаÑение на оÑнове вÑего маÑÑива, вÑзÑваÑfuncÐ´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа и пеÑÐµÐ´Ð°Ð²Ð°Ñ Ð¿ÑомежÑÑоÑнÑй ÑезÑлÑÑÐ°Ñ Ð¼ÐµÐ¶Ð´Ñ Ð²Ñзовами.
-
ÐополниÑелÑно:
Array.isArray(arr)пÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸arrмаÑÑивом.
ÐожалÑйÑÑа, обÑаÑиÑе внимание, ÑÑо меÑÐ¾Ð´Ñ push, pop, shift, unshift, 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â¦)