Array.prototype.forEach()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015å¹´7æ.
forEach() ã¡ã½ããã¯ãä¸ãããã颿°ããé
åã®åè¦ç´ ã«å¯¾ãã¦ä¸åº¦ãã¤å®è¡ãã¾ãã
試ãã¦ã¿ã¾ããã
const array = ["a", "b", "c"];
array.forEach((element) => console.log(element));
// äºæ³ãããçµæ: "a"
// äºæ³ãããçµæ: "b"
// äºæ³ãããçµæ: "c"
æ§æ
forEach(callbackFn)
forEach(callbackFn, thisArg)
弿°
callbackFn-
é åã®ããããã®è¦ç´ ã«å¯¾ãã¦å®è¡ãã颿°ãè¿å¤ã¯ç ´æ£ããã¾ãããã®é¢æ°ã¯ä»¥ä¸ã®å¼æ°ã§å¼ã³åºããã¾ãã
thisArgçç¥å¯-
callbackFnãå®è¡ããã¨ãã«thisã¨ãã¦ä½¿ç¨ããå¤ã§ããå復å¦çã¡ã½ãããåç §ãã¦ãã ããã
è¿å¤
ãªã (undefined)ã
解説
forEach() ã¡ã½ããã¯å復å¦çã¡ã½ããã§ããæå®ããã颿° callbackFn ãé
åã«å«ã¾ããåè¦ç´ ã«å¯¾ãã¦ä¸åº¦ãã¤ãæé ã§å¼ã³åºãã¾ãã map() ã¨ç°ãªãã forEach() ã¯å¸¸ã« undefined ãè¿ããé£éããããã¨ã¯ã§ãã¾ãããå
¸åçãªä½¿ç¨ããç¨éã¯ããã§ã¼ã³ã®çµããã§å¯æ¬¡å¹æãå®è¡ãããã¨ã§ãããããã®ã¡ã½ãããä¸è¬çã«ã©ã®ããã«åä½ããã®ãã«ã¤ãã¦ã®è©³ç´°ã¯ãå復å¦çã¡ã½ããã®ç¯ãã覧ä¸ããã
callbackFn ã¯å¤ãå²ãå½ã¦ããã¦ããé
åã¤ã³ããã¯ã¹ã«å¯¾ãã¦ã®ã¿å¼ã³åºããã¾ããçé
åã§ç©ºã®ã¹ãããã«å¯¾ãã¦ã¯å¼ã³åºããã¾ããã
forEach() ã¡ã½ããã¯æ±ç¨çã§ãããã㯠this å¤ã« length ããããã£ã¨æ´æ°ãã¼ã®ããããã£ããããã¨ã ããæå¾
ãã¾ãã
ä¾å¤ãçºçãã以å¤ã®æ¹æ³ã§ã forEach() ã«ã¼ããæ¢ãããè±åºãããããæ¹æ³ã¯ããã¾ããããã®ãããªåä½ãè¡ãå ´åã forEach() ã¡ã½ããã¯é©åãªæ¹æ³ã§ã¯ããã¾ããã
æ©æçµäºã¯ for, for...of, for...in ã®ãããªã«ã¼ãæã§è¡ããã¨ãã§ãã¾ããã¾ããevery(), some(), find(), findIndex() ã®ãããªé
åã¡ã½ãããããã以ä¸ã®å復å¦çãä¸è¦ãªå ´åã¯ãç´ã¡ã«å復å¦çã忢ãã¾ãã
forEach() ã¯åæé¢æ°ãæå¾
ãã¾ãããããã¹ãå¾
ã¡ã¾ãããforEach ã®ã³ã¼ã«ããã¯ã¨ãã¦ãããã¹ï¼ã¾ãã¯éåæé¢æ°ï¼ã使ç¨ããå ´åã¯ããã®æå³åããçè§£ãã¦ããããã«ãã¦ãã ããã
const ratings = [5, 4, 5];
let sum = 0;
const sumFunction = async (a, b) => a + b;
ratings.forEach(async (rating) => {
sum = await sumFunction(sum, rating);
});
console.log(sum);
// æ¬æ¥æå¾
ãããåºå: 14
// å®éã®åºå: 0
ä¸é£ã®éåæå¦çãé æ¬¡ã¾ãã¯ä¸¦åã«å®è¡ããã«ã¯ããããã¹ã®åæãåç §ãã¦ãã ããã
ä¾
>for ã«ã¼ããã forEach ã¸ã®å¤æ
const items = ["item1", "item2", "item3"];
const copyItems = [];
// before
for (let i = 0; i < items.length; i++) {
copyItems.push(items[i]);
}
// after
items.forEach((item) => {
copyItems.push(item);
});
é åã®å 容ã®åºå
ã¡ã¢:
é
åã®å
容ãã³ã³ã½ã¼ã«ã«è¡¨ç¤ºããããã«ãé
åã®æ´å½¢æ¸ã¿ã®ãã¼ã¸ã§ã³ã表示ãã console.table() ã使ç¨ãããã¨ãã§ãã¾ãã
以ä¸ã®ä¾ã§ã¯åããã¨ã forEach() ã使ç¨ãã¦è¡ãä»ã®æ¹æ³ã説æãã¦ãã¾ãã
次ã®ã³ã¼ãã¯é åã®è¦ç´ ãã¨ã«ãã³ã³ã½ã¼ã«ã« 1 è¡ãã¤è¦ç´ ã®å 容ãåºåãã¾ãã
const 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 ã®ä½¿ç¨
以ä¸ã®ï¼ä¸èªç¶ãªï¼ä¾ã¯ãé åã®ä¸ã®åé ç®ãããªãã¸ã§ã¯ãã®ããããã£ãæ´æ°ãã¾ãã
class Counter {
constructor() {
this.sum = 0;
this.count = 0;
}
add(array) {
// Only function expressions have their own this bindings.
array.forEach(function countEntry(entry) {
this.sum += entry;
++this.count;
}, this);
}
}
const obj = new Counter();
obj.add([2, 5, 9]);
console.log(obj.count); // 3
console.log(obj.sum); // 16
thisArg 弿° (this) ã forEach() ã«æä¾ããã¦ãããããcallbackFn ã®å¼ã³åºãã®ãã³ã«ãããæ¸¡ããã¾ããã³ã¼ã«ããã¯ã¯ããã this ã®å¤ã¨ãã¦ä½¿ç¨ãã¾ãã
ã¡ã¢:
ã³ã¼ã«ããã¯é¢æ°ã®åãæ¸¡ãã«ã¢ãã¼é¢æ°å¼ã使ç¨ããå ´åãthisArg 弿°ã¯ãã¢ãã¼é¢æ°ãææ³çã« this ã®å¤ã«çµã³ä»ãããã¦ããããçç¥å¯è½ã§ãã
ãªãã¸ã§ã¯ããã³ãã¼ãã颿°
次ã®ã³ã¼ãã¯ä¸ãããããªãã¸ã§ã¯ãã®ã³ãã¼ãçæãã¾ãã
ãªãã¸ã§ã¯ãã®ã³ãã¼ã使ããã«ã¯æ§ã
ãªæ¹æ³ãããã¾ãã
以ä¸ã®ãã®ã¯ä¸ã¤ã®æ¹æ³ã§ãArray.prototype.forEach() ã Object.* ã¦ã¼ãã£ãªãã£é¢æ°ã使ç¨ãã¦ãã©ã®ããã«åä½ãããã説æãã¦ãã¾ãã
const copy = (obj) => {
const copy = Object.create(Object.getPrototypeOf(obj));
const propNames = Object.getOwnPropertyNames(obj);
propNames.forEach((name) => {
const desc = Object.getOwnPropertyDescriptor(obj, name);
Object.defineProperty(copy, name, desc);
});
return copy;
};
const obj1 = { a: 1, b: 2 };
const obj2 = copy(obj1); // obj2 looks like obj1 now
é åã®å¹³å¦å
次ã®ä¾ã¯å¦ç¿ç®çã ãã®ãã®ã§ããçµã¿è¾¼ã¿ã¡ã½ããã使ç¨ãã¦é
åãå¹³å¦åãããå ´åã¯ãArray.prototype.flat() ã使ç¨ãããã¨ãã§ãã¾ãã
const flatten = (arr) => {
const result = [];
arr.forEach((item) => {
if (Array.isArray(item)) {
result.push(...flatten(item));
} else {
result.push(item);
}
});
return result;
};
// ä½¿ç¨æ¹æ³
const nested = [1, 2, 3, [4, 5, [6, 7], 8, 9]];
console.log(flatten(nested)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
callbackFn ã®ç¬¬ 3 弿°ã®ä½¿ç¨
array 弿°ã¯ãé
åã®å¥ã®è¦ç´ ã«ã¢ã¯ã»ã¹ãããå ´åãç¹ã«é
åãåç
§ããæ¢åã®å¤æ°ãä¿æãã¦ããªãå ´åã«ä¾¿å©ã§ããæ¬¡ã®ä¾ã§ã¯ãæåã® filter() ã使ç¨ãã¦æ£ã®å¤ãæ½åºããæ¬¡ã« forEach() ã使ç¨ãã¦ãã®ä»è¿ããã°ã«è¨é²ãã¾ãã
const numbers = [3, -1, 1, 4, 1, 5];
numbers
.filter((num) => num > 0)
.forEach((num, idx, arr) => {
// arr 弿°ããªãå ´åã夿°ã«ä¿åããã«ä¸éé
åã«
// ç°¡åã«ã¢ã¯ã»ã¹ããæ¹æ³ã¯ãªã
console.log(arr[idx - 1], num, arr[idx + 1]);
});
// undefined 3 1
// 3 1 4
// 1 4 1
// 4 1 5
// 1 5 undefined
çé åã«å¯¾ãã forEach() ã®ä½¿ç¨
const arraySparse = [1, 3, /* 空 */, 7];
let numCallbackRuns = 0;
arraySparse.forEach((element) => {
console.log({ element });
numCallbackRuns++;
});
console.log({ numCallbackRuns });
// { element: 1 }
// { element: 3 }
// { element: 7 }
// { numCallbackRuns: 3 }
3 㨠7 ã®éã®å¤ããªãã¨ããã§ãã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºãããªãã£ããã¨ãåããã¾ãã
é å以å¤ã®ãªãã¸ã§ã¯ãã«å¯¾ãã forEach() ã®å¼ã³åºã
forEach() ã¡ã½ãã㯠this ã® length ããããã£ãèªã¿è¾¼ã¿ã次ã«ãã¼ã length ããå°ããéè² ã®æ´æ°ã§ããåããããã£ã«ã¢ã¯ã»ã¹ãã¾ãã
const arrayLike = {
length: 3,
0: 2,
1: 3,
2: 4,
3: 5, // length ã 3 ã§ãããã forEach() ããã¯ç¡è¦ããã
};
Array.prototype.forEach.call(arrayLike, (x) => console.log(x));
// 2
// 3
// 4
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.foreach> |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
Array.prototype.forEachã®ããªãã£ã« (core-js)- es-shims ã«ãã
Array.prototype.forEachã®ããªãã£ã« - ã¤ã³ããã¯ã¹ä»ãã³ã¬ã¯ã·ã§ã³ã®ã¬ã¤ã
ArrayArray.prototype.find()Array.prototype.map()Array.prototype.filter()Array.prototype.every()Array.prototype.some()TypedArray.prototype.forEach()Map.prototype.forEach()Set.prototype.forEach()