자바 스크립트 : .forEach ()와 .map ()의 차이점


116

이런 주제가 많았다는 것을 알고 있습니다. 그리고 기본 사항을 알고 있습니다. .forEach()원래 어레이와 .map()새 어레이에서 작동합니다 .

나의 경우에는:

function practice (i){
    return i+1;
};

var a = [ -1, 0, 1, 2, 3, 4, 5 ];
var b = [ 0 ];
var c = [ 0 ];
console.log(a);
b = a.forEach(practice);
console.log("=====");
console.log(a);
console.log(b);
c = a.map(practice);
console.log("=====");
console.log(a);
console.log(c);

그리고 이것은 출력입니다.

[ -1, 0, 1, 2, 3, 4, 5 ]
=====
[ -1, 0, 1, 2, 3, 4, 5 ]
undefined
=====
[ -1, 0, 1, 2, 3, 4, 5 ]
[ 0, 1, 2, 3, 4, 5, 6 ]

사용하는 이유를 이해할 수없는 practice변화의 가치 bundefined.
이 질문이 어리석은 질문이라면 미안하지만이 언어가 상당히 새롭고 지금까지 찾은 답변이 만족스럽지 않았습니다.


49
간단합니다 : .map 새로운 배열을 반환하는 반면.forEach 아무것도 반환하지 않습니다 . 기본적으로 이전 배열의 수정 된 형태를 얻으려면을 사용 .map하고 원하지 않으면 .forEach.
user4642212 dec.


@Xufox-새 항목을 만들기 전에이 항목을 빨간색으로 표시했지만 답변이 만족스럽지 않았습니다.
DzikiChrzan 2015

만족스럽지 않다고 말하지 마십시오. 질문에 정확히 어떻게 답하지 않습니까 (모든 답변을 읽었습니까?)? 제안 된 중복 대상에서 다루지 않는 특정 질문은 무엇입니까?
user4642212 2015

@Xufox이 질문은 자체 구현 기능을 다루며 실제로 표준화 된 ES5 기능에 관한 것이 아닙니다.
찌르기

답변:


146

그들은 하나가 아니며 동일하지 않습니다. 차이점을 설명하겠습니다.

forEach: 목록을 반복하고 각 목록 구성원에 부작용이있는 일부 작업을 적용합니다 (예 : 모든 목록 항목을 데이터베이스에 저장).

map: 목록을 반복하고 해당 목록의 각 멤버를 변환하고 변환 된 멤버와 동일한 크기의 다른 목록을 반환합니다 (예 : 문자열 목록을 대문자로 변환).

참고 문헌

Array.prototype.forEach ()-JavaScript | MDN

Array.prototype.map ()-JavaScript | MDN


5
Xufox가 말했듯이-.forEach는 아무것도 반환하지 않습니다. 도와 줘서 고마워! 10 분 후에이 답을 표시하겠습니다.
DzikiChrzan

1
지도 반환 목록 및 forEach not. OK
Ashad Nasim

62
  • Array.forEach "배열 요소 당 한 번씩 제공된 함수를 실행합니다."

  • Array.map "이 배열의 모든 요소에 대해 제공된 함수를 호출 한 결과로 새 배열을 만듭니다."

그래서, forEach 실제로 아무것도 반환하지 않습니다. 각 배열 요소에 대한 함수를 호출하면 완료됩니다. 따라서 호출 된 함수 내에서 반환하는 모든 것은 단순히 버려집니다.

반면에는 map각 배열 요소에 대해 비슷하게 함수를 호출하지만 반환 값을 버리는 대신이를 캡처하고 해당 반환 값의 새 배열을 만듭니다.

이것은 또한 사용하는 곳 어디에서나 사용할 있지만 여전히 그렇게해서는 안되므로 목적없이 반환 값을 수집하지 마십시오. 필요하지 않은 경우 수집하지 않는 것이 더 효율적입니다.mapforEach


참고 : 2015 년에는 특히 이전 브라우저 (IE8 또는 9) 에서 지원하기 위해 폴리 필이 필요한 경우 forEach보다 "더 효율적"이었을 것이라고 주장 할 수 map있었습니다 forEach. 당신은 map어떤 것에 대한 반환을 할당 할 필요가 없습니다 ; 반환 값은 map반환이 map할당되지 않은 경우 반환 직후 가비지 수집 됩니다.
cowbert

3
@cowbert 무언가가 즉시 가비지 수집된다고해서 필요한 할당에 맞지 않는다는 의미는 아닙니다. 그래서 forEach것이다 개념적으로 훨씬 더 효율적이고 더 나은 당신이 수집 결과를 필요로하지 않는 작업에 적합합니다. 그리고 나는 당신에 대해 모르지만 2015 년에 나는 더 이상 IE8을 위해 개발하지 않았습니다 (btw.도 지원하지 않았습니다 map); 및 IE9 + 지원 forEach. 실제로 답변을 한 지 한 달 후에 Microsoft는 해당 브라우저에 대한 지원을 종료했습니다.
찌를

forEach와 map 모두 동일한 순서로 요소를 처리하도록 보장됩니까?
Quentin 2

1
Quentin2 @ 네, 또한, 두 기능은 동기, 그래서 mapforEach전체 배열을 통해 반복 된 콜백이 각각 호출 된 후에 호출 만 반환합니다.
찌를

25
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| | foreach | 지도 |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| 기능 | 각각에 대해 주어진 작업을 수행 | 주어진 "변환"을 수행 |
| | 배열의 요소 | 각 요소의 "복사"|
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| 반환 값 | 정의되지 않은 반환 | 변형 된 새 배열을 반환합니다.
| | | 원래 배열을 남기는 요소 |
| | | 변경되지 않은 |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| 선호하는 | 비 변환 수행 | 출력을 포함하는 배열 얻기 |
| 사용 시나리오 | 각 요소에 대한 처리. | 각 요소에 대해 수행되는 일부 처리 |
| 및 예 | | 배열의. |
| | 예를 들어 모든 요소를 ​​| |
| | 데이터베이스 | 예를 들어, |
| | | 의 각 문자열 길이 |
| | | 배열 |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +

게시물을 수정 하고 이미지 대신 실제 텍스트를 보여 주세요 . 다른 사용자는 이미지에서 복사하여 붙여 넣거나 이미지 내에서 검색하거나 이미지의 텍스트 콘텐츠를 개선 할 수 없습니다. 자세한 내용은 여기참조하십시오 . 감사합니다.
Pang

2
이것은 ASCII 아트 테이블을 그리는 데 도움이 될 수 있습니다 : webapps.stackexchange.com/q/6700/126269
Pang


7

forEach : Array의 요소에 대한 작업을 수행하려는 경우 for 루프를 사용하는 것과 동일합니다. 이 방법의 결과는 우리에게 출력 구매를 제공하지 않습니다.

map : 배열의 요소에 대해 작업을 수행하고 작업의 출력을 Array에 저장하려는 경우. 이는 각 반복 후 결과를 반환하는 함수 내의 for 루프와 유사합니다.

도움이 되었기를 바랍니다.


5

차이점은 그들이 반환하는 것에 있습니다. 실행 후 :

arr.map()

처리 된 함수에서 생성 된 요소의 배열을 반환합니다. 동안:

arr.forEach()

undefined를 반환합니다.


5

성능 분석 For 루프는 배열의 요소 수가 증가함에 따라 map 또는 foreach보다 빠르게 수행됩니다.

let array = [];
for (var i = 0; i < 20000000; i++) {
  array.push(i)
}

console.time('map');
array.map(num => {
  return num * 4;
});
console.timeEnd('map');


console.time('forEach');
array.forEach((num, index) => {
  return array[index] = num * 4;
});
console.timeEnd('forEach');

console.time('for');
for (i = 0; i < array.length; i++) {
  array[i] = array[i] * 2;

}
console.timeEnd('for');

내 컴퓨터의 결과는 다음과 같습니다.map: 1642ms forEach: 885ms for: 748ms
Flavio Vilante


1

한 가지 지적 할 점은 foreach는 초기화되지 않은 값을 건너 뛰는 반면 map은 그렇지 않다는 것입니다.

var arr = [1, , 3];

arr.forEach(function(element) {
    console.log(element);
});
//Expected output: 1 3

console.log(arr.map(element => element));
//Expected output: [1, undefined, 3];

0

forEach ()와 map ()의 차이점

forEach () 는 요소를 반복합니다. 반환 값을 버리고 항상 undefined를 반환합니다.이 메서드의 결과는 출력을 제공하지 않습니다.

지도()요소를 통한 루프는 메모리를 할당하고 기본 배열을 반복하여 반환 값을 저장합니다.

예:

   var numbers = [2,3,5,7];

   var forEachNum = numbers.forEach(function(number){
      return number
   })
   console.log(forEachNum)
   //output undefined

   var mapNum = numbers.map(function(number){
      return number
   })
   console.log(mapNum)
   //output [2,3,5,7]

map ()이 forEach ()보다 빠릅니다.



0

각각() :

반환 값 : 정의되지 않음

originalArray : 메서드 호출 후 수정 됨

map () :

반환 값 : 호출 배열의 모든 요소에 대해 제공된 함수를 호출 한 결과로 채워진 새 배열

originalArray : 메서드 호출 후 수정되지 않음

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.