Baseline Widely available
ÐеÑод forEach()
вÑполнÑÐµÑ ÑказаннÑÑ ÑÑнкÑÐ¸Ñ Ð¾Ð´Ð¸Ð½ Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа в маÑÑиве.
const array1 = ["a", "b", "c"];
array1.forEach((element) => console.log(element));
// Expected output: "a"
// Expected output: "b"
// Expected output: "c"
СинÑакÑиÑ
arr.forEach(function callback(currentValue, index, array) { //your iterator }[, thisArg]);ÐаÑамеÑÑÑ
callback
ФÑнкÑиÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа маÑÑива. Ðна пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ до ÑÑÑÑ Ð°ÑгÑменÑов:
currentValue
ТекÑÑий обÑабаÑÑваемÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² маÑÑиве.
index
ÐеобÑзаÑелÑнÑй
ÐÐ½Ð´ÐµÐºÑ ÑекÑÑего обÑабаÑÑваемого ÑлеменÑа в маÑÑиве.
array
ÐеобÑзаÑелÑнÑй
ÐаÑÑив, по коÑоÑÐ¾Ð¼Ñ Ð¾ÑÑÑеÑÑвлÑеÑÑÑ Ð¿ÑÐ¾Ñ Ð¾Ð´.
thisArg
ÐеобÑзаÑелÑнÑй паÑамеÑÑ. ÐнаÑение, иÑполÑзÑемое в каÑеÑÑве this
пÑи вÑзове ÑÑнкÑии callback
.
ÐеÑод forEach()
вÑполнÑÐµÑ ÑÑнкÑÐ¸Ñ callback
один Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа, наÑ
одÑÑегоÑÑ Ð² маÑÑиве в поÑÑдке возÑаÑÑаниÑ. Ðна не бÑÐ´ÐµÑ Ð²Ñзвана Ð´Ð»Ñ ÑдалÑннÑÑ
или пÑопÑÑеннÑÑ
ÑлеменÑов маÑÑива. Ðднако, она бÑÐ´ÐµÑ Ð²Ñзвана Ð´Ð»Ñ ÑлеменÑов, коÑоÑÑе пÑиÑÑÑÑÑвÑÑÑ Ð² маÑÑиве и имеÑÑ Ð·Ð½Ð°Ñение undefined
.
ФÑнкÑÐ¸Ñ callback
бÑÐ´ÐµÑ Ð²Ñзвана Ñ ÑÑÐµÐ¼Ñ Ð°ÑгÑменÑами:
ÐÑли в меÑод forEach()
бÑл пеÑедан паÑамеÑÑ thisArg
, пÑи вÑзове callback
он бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² каÑеÑÑве знаÑÐµÐ½Ð¸Ñ this
. РпÑоÑивном ÑлÑÑае, в каÑеÑÑве знаÑÐµÐ½Ð¸Ñ this
бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð·Ð½Ð°Ñение undefined
. РконеÑном иÑоге, знаÑение this
, наблÑдаемое из ÑÑнкÑии callback
, опÑеделÑеÑÑÑ ÑоглаÑно обÑÑнÑм пÑавилам опÑеделениÑ
.this
, видимого из ÑÑнкÑии
Ðиапазон ÑлеменÑов, обÑабаÑÑваемÑÑ
меÑодом forEach()
, ÑÑÑанавливаеÑÑÑ Ð´Ð¾ пеÑвого вÑзова ÑÑнкÑии callback
. ÐлеменÑÑ, добавленнÑе в маÑÑив поÑле наÑала вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¼ÐµÑода forEach()
, не бÑдÑÑ Ð¿Ð¾ÑеÑÐµÐ½Ñ ÑÑнкÑией callback
. ÐÑли ÑÑÑеÑÑвÑÑÑие ÑлеменÑÑ Ð¼Ð°ÑÑива изменÑÑÑÑ, знаÑениÑ, пеÑеданнÑе в ÑÑнкÑÐ¸Ñ callback
, бÑдÑÑ Ð·Ð½Ð°ÑениÑми на ÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени, когда меÑод forEach()
поÑеÑÐ¸Ñ Ð¸Ñ
; ÑдалÑннÑе ÑлеменÑÑ Ð¿Ð¾ÑеÑÐµÐ½Ñ Ð½Ðµ бÑдÑÑ. ÐÑли Ñже поÑеÑÑннÑе ÑлеменÑÑ ÑдалÑÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¸ÑеÑаÑии (напÑимеÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ shift()
), поÑледÑÑÑие ÑлеменÑÑ Ð±ÑдÑÑ Ð¿ÑопÑÑенÑ. (СмоÑÑи пÑÐ¸Ð¼ÐµÑ Ð½Ð¸Ð¶Ðµ
)
ÐÑимеÑание: Ðе ÑÑÑеÑÑвÑÐµÑ ÑпоÑоба оÑÑановиÑÑ Ð¸Ð»Ð¸ пÑеÑваÑÑ Ñикл forEach()
кÑоме как вÑбÑаÑÑванием иÑклÑÑениÑ. ÐÑли вам необÑ
одимо Ñакое поведение, меÑод forEach()
непÑавилÑнÑй вÑбоÑ.
ÐоÑÑоÑное пÑекÑаÑение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾ÑÑигнÑÑо Ñ:
for
for...of
/ for...in
Array.prototype.every()
Array.prototype.some()
Array.prototype.find()
Array.prototype.findIndex()
ÐÑли нÑжно пÑоÑеÑÑиÑоваÑÑ ÑлеменÑÑ Ð¼Ð°ÑÑива на ÑÑловие и нÑжно веÑнÑÑÑ Ð±Ñлево знаÑение, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе воÑполÑзоваÑÑÑÑ Ð¼ÐµÑодами every()
, some()
, find()
или findIndex()
.
ÐеÑод forEach()
вÑполнÑÐµÑ ÑÑнкÑÐ¸Ñ callback
один Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа маÑÑива; в оÑлиÑие Ð¾Ñ Ð¼ÐµÑодов every()
и some()
, он вÑегда возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение undefined
.
const arraySparse = [1, 3, , 7];
let numCallbackRuns = 0;
arraySparse.forEach((element) => {
console.log(element);
numCallbackRuns++;
});
console.log("numCallbackRuns: ", numCallbackRuns);
// 1
// 3
// 7
// numCallbackRuns: 3
// комменÑаÑий: как Ð²Ñ Ð²Ð¸Ð´Ð¸Ñе пÑопÑÑенное знаÑение Ð¼ÐµÐ¶Ð´Ñ 3 и 7 не вÑзÑвало ÑÑнкÑÐ¸Ñ callback.
ÐонвеÑÑиÑÑем Ñикл for в forEach
const items = ["item1", "item2", "item3"];
const copy = [];
// до
for (let i = 0; i < items.length; i++) {
copy.push(items[i]);
}
// поÑле
items.forEach(function (item) {
copy.push(item);
});
ÐеÑаÑÑ ÑодеÑжимого маÑÑива
ÐÑимеÑание: ÐÐ»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑодеÑжимого маÑÑива в конÑоли Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ console.table()
, коÑоÑÑй вÑÐ²Ð¾Ð´Ð¸Ñ Ð¾ÑÑоÑмаÑиÑованнÑÑ Ð²ÐµÑÑÐ¸Ñ Ð¼Ð°ÑÑива.
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð¸Ð»Ð»ÑÑÑÑиÑÑÐµÑ Ð°Ð»ÑÑеÑнаÑивнÑй подÑ
од, иÑполÑзÑÑÑий forEach()
.
СледÑÑÑий код вÑÐ²Ð¾Ð´Ð¸Ñ ÐºÐ°Ð¶Ð´Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива на новой ÑÑÑоке жÑÑнала:
function logArrayElements(element, index, array) {
console.log("a[" + index + "] = " + element);
}
// ÐбÑаÑиÑе внимание на пÑопÑÑк по индекÑÑ 2, Ñам Ð½ÐµÑ ÑлеменÑа, поÑÑÐ¾Ð¼Ñ Ð¾Ð½ не поÑеÑаеÑÑÑ
[2, 5, , 9].forEach(logArrayElements);
// логи:
// a[0] = 2
// a[1] = 5
// a[3] = 9
ÐÑполÑзование thisArg
СледÑÑÑий (надÑманнÑй) пÑÐ¸Ð¼ÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÐµÑ ÑвойÑÑва обÑекÑа, когда пеÑебиÑÐ°ÐµÑ Ð·Ð°Ð¿Ð¸Ñи маÑÑива:
function Counter() {
this.sum = 0;
this.count = 0;
}
Counter.prototype.add = function (array) {
array.forEach((entry) => {
this.sum += entry;
++this.count;
}, this);
// ^---- Note
};
const obj = new Counter();
obj.add([2, 5, 9]);
obj.count;
// 3
obj.sum;
// 16
ÐоÑколÑÐºÑ Ð² forEach()
пеÑедан паÑамеÑÑ thisArg
(this
), он заÑем пеÑедаÑÑÑÑ Ð² callback
пÑи каждом вÑзове. Ð callback иÑполÑзÑÐµÑ ÐµÐ³Ð¾ в каÑеÑÑве ÑобÑÑвенного знаÑÐµÐ½Ð¸Ñ this
.
ÐÑимеÑание: ÐÑли пÑи пеÑедаÑе callback ÑÑнкÑии иÑполÑзÑеÑÑÑ Ð²ÑÑажение ÑÑÑелоÑной ÑÑнкÑии
, паÑамеÑÑ thisArg
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÑÑен, Ñак как вÑе ÑÑÑелоÑнÑе ÑÑнкÑии лекÑиÑеÑки пÑивÑзÑваÑÑÑÑ Ðº знаÑениÑthis
.
СледÑÑÑий код иÑполÑзÑÐµÑ Array.prototype.every()
Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑодеÑжимого маÑÑива и оÑÑанавливаеÑÑÑ Ð¿Ñи пÑевÑÑении знаÑением заданного поÑогового знаÑÐµÐ½Ð¸Ñ THRESHOLD
.
var THRESHOLD = 12;
var v = [5, 2, 16, 4, 3, 18, 20];
var res;
res = v.every(function (element, index, array) {
console.log("element:", element);
if (element >= THRESHOLD) {
return false;
}
return true;
});
console.log("res:", res);
// логи:
// element: 5
// element: 2
// element: 16
// res: false
res = v.some(function (element, index, array) {
console.log("element:", element);
if (element >= THRESHOLD) {
return true;
}
return false;
});
console.log("res:", res);
// логи:
// element: 5
// element: 2
// element: 16
// res: true
ФÑнкÑÐ¸Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑа
СледÑÑÑий код ÑоздаÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð¿ÐµÑеданного обÑекÑа. СÑÑеÑÑвÑÐµÑ Ð½ÐµÑколÑко ÑпоÑобов ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸ обÑекÑа, и ÑÑо один из ниÑ
. Ðн позволÑÐµÑ Ð¿Ð¾Ð½ÑÑÑ, каким обÑазом ÑабоÑÐ°ÐµÑ Array.prototype.forEach()
, иÑполÑзÑÑ ÑÑнкÑии меÑа-ÑвойÑÑв Object.*
из ECMAScript 5.
function copy(o) {
var copy = Object.create(Object.getPrototypeOf(o));
var propNames = Object.getOwnPropertyNames(o);
propNames.forEach(function (name) {
var desc = Object.getOwnPropertyDescriptor(o, name);
Object.defineProperty(copy, name, desc);
});
return copy;
}
var o1 = { a: 1, b: 2 };
var o2 = copy(o1); // ÑепеÑÑ o2 вÑглÑÐ´Ð¸Ñ Ñакже, как и o1
ÐодиÑикаÑÐ¸Ñ Ð¼Ð°ÑÑива во вÑÐµÐ¼Ñ Ð¸ÑеÑаÑии
Ð ÑледÑÑÑем пÑимеÑе в лог вÑводиÑÑÑ "one"
, "two"
, "four"
.
ÐÑи доÑÑижении запиÑи, ÑодеÑжаÑей знаÑение 'two'
, пеÑÐ²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð²Ñего маÑÑива ÑдалÑеÑÑÑ, в ÑезÑлÑÑаÑе Ñего вÑе оÑÑавÑиеÑÑ Ð·Ð°Ð¿Ð¸Ñи пеÑемеÑаÑÑÑÑ Ð½Ð° Ð¾Ð´Ð½Ñ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð²Ð²ÐµÑÑ
. ÐоÑколÑÐºÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ 'four'
ÑепеÑÑ Ð½Ð°Ñ
одиÑÑÑ Ð½Ð° более Ñанней позиÑии в маÑÑиве, 'three'
бÑÐ´ÐµÑ Ð¿ÑопÑÑен.
forEach()
не Ð´ÐµÐ»Ð°ÐµÑ ÐºÐ¾Ð¿Ð¸Ñ Ð¼Ð°ÑÑива пеÑед иÑеÑаÑией.
let words = ["one", "two", "three", "four"];
words.forEach((word) => {
console.log(word);
if (word === "two") {
words.shift();
}
});
// one
// two
// four
ÐÑÑавнивание (ÑплоÑение) маÑÑива
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð¿ÑиведÑн ÑолÑко Ð´Ð»Ñ Ñелей обÑÑениÑ. ÐÑли Ð²Ñ Ñ
оÑиÑе вÑÑавнÑÑÑ Ð¼Ð°ÑÑив Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²ÑÑÑоеннÑÑ
меÑодов, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Array.prototype.flat()
function flatten(arr) {
const result = [];
arr.forEach((i) => {
if (Array.isArray(i)) {
result.push(...flatten(i));
} else {
result.push(i);
}
});
return result;
}
// Usage
const nested = [1, 2, 3, [4, 5, [6, 7], 8, 9]];
flatten(nested); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
ÐолиÑил
ÐеÑод forEach()
бÑл добавлен к ÑÑандаÑÑÑ ECMA-262 в 5-м издании; поÑÑÐ¾Ð¼Ñ Ð¾Ð½ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑÑÑÑÑвоваÑÑ Ð² дÑÑгиÑ
ÑеализаÑиÑÑ
ÑÑандаÑÑа. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑабоÑаÑÑ Ñ Ð½Ð¸Ð¼, добавив ÑледÑÑÑий код в наÑало ваÑиÑ
ÑкÑипÑов, он позволÑÐµÑ Ð¸ÑполÑзоваÑÑ forEach()
в ÑеализаÑиÑÑ
, коÑоÑÑе не поддеÑживаÑÑ ÑÑÐ¾Ñ Ð¼ÐµÑод. ÐÑÐ¾Ñ Ð°Ð»Ð³Ð¾ÑиÑм ÑвлÑеÑÑÑ ÑоÑно Ñем, ÑÑо опиÑан в ECMA-262 5-го изданиÑ; он пÑедполагаеÑ, ÑÑо Object
и TypeError
имеÑÑ Ñвои пеÑвонаÑалÑнÑе знаÑÐµÐ½Ð¸Ñ Ð¸ ÑÑо callback.call
вÑÑиÑлÑеÑÑÑ Ð² оÑигиналÑное знаÑение Function.prototype.call()
.
// Шаги алгоÑиÑма ECMA-262, 5-е издание, 15.4.4.18
// СÑÑлка (en): http://es5.github.io/#x15.4.4.18
// СÑÑлка (ru): http://es5.javascript.ru/x15.4.html#x15.4.4.18
if (!Array.prototype.forEach) {
Array.prototype.forEach = function (callback, thisArg) {
var T, k;
if (this == null) {
throw new TypeError(" this is null or not defined");
}
// 1. Ðоложим O ÑавнÑм ÑезÑлÑÑаÑÑ Ð²Ñзова ToObject passing the |this| value as the argument.
var O = Object(this);
// 2. Ðоложим lenValue ÑавнÑм ÑезÑлÑÑаÑÑ Ð²Ñзова внÑÑÑеннего меÑода Get обÑекÑа O Ñ Ð°ÑгÑменÑом "length".
// 3. Ðоложим len ÑавнÑм ToUint32(lenValue).
var len = O.length >>> 0;
// 4. ÐÑли IsCallable(callback) Ñавен false, вÑкинем иÑклÑÑение TypeError.
// СмоÑÑиÑе: http://es5.github.com/#x9.11
if (typeof callback !== "function") {
throw new TypeError(callback + " is not a function");
}
// 5. ÐÑли thisArg пÑиÑÑÑÑÑвÑеÑ, положим T ÑавнÑм thisArg; инаÑе положим T ÑавнÑм undefined.
if (arguments.length > 1) {
T = thisArg;
}
// 6. Ðоложим k ÑавнÑм 0
k = 0;
// 7. Ðока k < len, бÑдем повÑоÑÑÑÑ
while (k < len) {
var kValue;
// a. Ðоложим Pk ÑавнÑм ToString(k).
// ÐÑо неÑвное пÑеобÑазование Ð´Ð»Ñ Ð»ÐµÐ²Ð¾ÑÑоÑоннего опеÑанда в опеÑаÑоÑе in
// b. Ðоложим kPresent ÑавнÑм ÑезÑлÑÑаÑÑ Ð²Ñзова внÑÑÑеннего меÑода HasProperty обÑекÑа O Ñ Ð°ÑгÑменÑом Pk.
// ÐÑÐ¾Ñ Ñаг Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±ÑединÑн Ñ Ñагом c
// c. ÐÑли kPresent Ñавен true, Ñо
if (k in O) {
// i. Ðоложим kValue ÑавнÑм ÑезÑлÑÑаÑÑ Ð²Ñзова внÑÑÑеннего меÑода Get обÑекÑа O Ñ Ð°ÑгÑменÑом Pk.
kValue = O[k];
// ii. ÐÑзовем внÑÑÑенний меÑод Call ÑÑнкÑии callback Ñ Ð¾Ð±ÑекÑом T в каÑеÑÑве знаÑÐµÐ½Ð¸Ñ this и
// ÑпиÑком аÑгÑменÑов, ÑодеÑжаÑим kValue, k и O.
callback.call(T, kValue, k, O);
}
// d. УвелиÑим k на 1.
k++;
}
// 8. ÐеÑнÑм undefined.
};
}
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4