문제

이상의 컴퓨터 과학,질문에 이 질문을 기반으로 특정 언어로,그러나 사이에 차이가 있습지도 작업 및 foreach 운영?또는 그들은 단순히 서로 다른 이름 같은 것은?

도움이 되었습니까?

해결책

다른.

Foreach는 목록을 반복하고 각 목록 멤버에 부작용으로 일부 작업을 적용합니다 (예 : 각각 하나를 데이터베이스에 저장하는 것과 같은)

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

다른 팁

그들 사이의 중요한 차이점은 그 것입니다 map 모든 결과를 컬렉션으로 축적하는 반면 foreach 아무것도 반환하지 않습니다. map 일반적으로 함수로 요소 모음을 변환하려는 경우에 사용됩니다. foreach 단순히 각 요소에 대한 작업을 실행합니다.

요컨대, foreach 요소 모음의 각 요소에 작업을 적용하는 반면 map 한 컬렉션을 다른 컬렉션으로 변환하는 것입니다.

두 가지 중요한 차이점이 있습니다 foreach 그리고 map.

  1. foreach 요소를 인수로 받아들이는 것 외에는 적용되는 작업에 대한 개념적 제한이 없습니다. 즉, 작업은 아무것도하지 않을 수 있고, 부작용을 가질 수 있고, 값을 반환하거나 값을 반환 할 수 없을 수도 있습니다. 모두 foreach 관심은 요소 모음을 반복하고 각 요소에 작업을 적용하는 것입니다.

    map, 반면에, 작전에 제한이 있습니다. 작업이 요소를 반환 할 것으로 예상하고 아마도 요소를 인수로 받아 들일 것입니다. 그만큼 map 작전은 요소 모음을 통해 반복되어 각 요소의 작업을 적용하고 마지막으로 작업을 다른 컬렉션에 보관 한 결과를 다른 컬렉션에 저장합니다. 다시 말해, map 변환 하나의 컬렉션으로의 컬렉션.

  2. foreach 단일 요소 모음과 함께 작동합니다. 이것은 입력 컬렉션입니다.

    map 입력 컬렉션과 출력 컬렉션의 두 가지 요소 컬렉션과 함께 작동합니다.

두 알고리즘을 연관시키는 것은 실수가 아닙니다. 사실, 두 계층을 볼 수 있습니다. map 전문화입니다 foreach. 즉, 사용할 수 있습니다 foreach 그리고 작전이 인수를 변환하고 다른 컬렉션에 삽입하도록하십시오. 그래서 foreach 알고리즘은 추상화, 일반화입니다. map 연산. 사실, 왜냐하면 foreach 운영에 대한 제한이 없습니다. foreach 가장 간단한 루핑 메커니즘이며 루프가 할 수있는 일을 수행 할 수 있습니다. map, 다른보다 전문화 된 알고리즘뿐만 아니라 표현력을위한 것이 있습니다. 하나의 컬렉션을 다른 컬렉션으로 매핑 (또는 변환)하려면 사용하는 경우 의도가 더 명확합니다. map 당신이 사용하는 것보다 foreach.

우리는이 토론을 더 확장 할 수 있으며 copy 알고리즘 : 컬렉션을 복제하는 루프. 이 알고리즘도의 전문화입니다 foreach 연산. 요소가 주어지면 동일한 요소를 다른 컬렉션에 삽입하는 작업을 정의 할 수 있습니다. 사용하는 경우 foreach 그 작업으로 실제로 당신은 copy 명확성, 표현력 또는 명시성이 감소하지만 알고리즘. 더 나아가자 : 우리는 map 전문화입니다 copy, 그 자체의 전문화 foreach. map 5월 변화 그것이 반복되는 모든 요소. 만약에 map 요소를 변경하지 않으면 단지 요소를 변경하지 않습니다 복사 요소 및 사용 복사 의도를 더 명확하게 표현할 것입니다.

그만큼 foreach 알고리즘 자체는 언어에 따라 리턴 값을 가질 수 있거나 없을 수 있습니다. 예를 들어 C ++에서 foreach 원래 수신 한 작업을 반환합니다. 아이디어는 작업에 상태가있을 수 있으며 해당 작업이 요소를 통해 어떻게 진화했는지 검사하기를 원할 수 있습니다. map, 또한 값을 반환하거나 반환 할 수도 있습니다. C ++에서 transform (동등한 map 여기에서)는 반복자를 출력 컨테이너 (컬렉션) 끝까지 반환합니다. 루비에서는 반환 값입니다 map 출력 시퀀스 (수집)입니다. 따라서 알고리즘의 반환 값은 실제로 구현 세부 사항입니다. 그들의 효과는 그들이 돌아 오는 것일 수도 있고 아닐 수도 있습니다.

Array.protototype.map 방법 & Array.protototype.forEach 둘 다 상당히 비슷합니다.

다음 코드를 실행하십시오. http://labs.codecademy.com/bw1/6#:WorkSpace

var arr = [1, 2, 3, 4, 5];

arr.map(function(val, ind, arr){
    console.log("arr[" + ind + "]: " + Math.pow(val,2));
});

console.log();

arr.forEach(function(val, ind, arr){
    console.log("arr[" + ind + "]: " + Math.pow(val,2));
});

그들은 정확한 결과를 제공합니다.

arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25

arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25

그러나 다음 코드를 실행할 때 트위스트가 나옵니다.

여기서 나는 단순히지도 및 foreach 메소드에서 반환 값의 결과를 할당했습니다.

var arr = [1, 2, 3, 4, 5];

var ar1 = arr.map(function(val, ind, arr){
    console.log("arr[" + ind + "]: " + Math.pow(val,2));
    return val;
});

console.log();
console.log(ar1);
console.log();

var ar2 = arr.forEach(function(val, ind, arr){
    console.log("arr[" + ind + "]: " + Math.pow(val,2));
    return val;
});

console.log();
console.log(ar2);
console.log();

이제 결과는 까다로운 일입니다!

arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25

[ 1, 2, 3, 4, 5 ]

arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25

undefined

결론

Array.prototype.map 배열을 반환하지만 Array.prototype.forEach 그렇지 않습니다. 따라서 전달 된 콜백 함수 내부의 반환 된 배열을 맵 메소드로 조작 한 다음 반환 할 수 있습니다.

Array.prototype.forEach 주어진 배열만으로 걸어 가면 배열을 걷는 동안 물건을 할 수 있습니다.

가장 '가시적 인'차이점은 맵이 새로운 컬렉션에서 결과를 축적하는 반면 Foreach는 실행 자체에 대해서만 수행된다는 것입니다.

그러나 몇 가지 추가 가정이 있습니다.지도의 '목적'은 새로운 값 목록이기 때문에 실제로 실행 순서가 중요하지 않습니다. 실제로, 일부 실행 환경은 병렬 코드를 생성하거나 심지어 일부는 전혀 전화를 피하기 위해 반복적 인 값이나 게으른 것을 요구하지 않도록 약간의 기억을 소개합니다.

반면에 Foreach는 특별히 부작용을 위해 불린다. 따라서 순서는 중요하며 일반적으로 병렬화 할 수 없습니다.

짧은 대답: mapforEach 는 다릅니다.또한,비공식적으로 말하기, map 은 엄격한 수퍼의 forEach.

긴 대답: 첫째,하나의 라인을 설명 forEachmap:

  • forEach 반복을 통해 모든 요소,전화된 함수에서 각.
  • map 반복을 통해 모든 요소,전화된 기능을 각각에,그리고 생산하는 변형을 배열을 기억하여 그 결과의 각 함수 호출합니다.

에서 많은 언어 forEach 라냥 each.다음과 같은 토론 사용 JavaScript 참조용입니다.그것은 정말 다른 어떤 언어입니다.

지금은,사용하자는 이러한 각각의 기능이 있다.

forEach:

작업 1: 작성 기능 printSquares, 는지 배열의 번호 arr, 며,인쇄 광장의 각 요소에서습니다.

솔루션 1:

var printSquares = function (arr) {
    arr.forEach(function (n) {
        console.log(n * n);
    });
};

map:

작업 2: 작성 기능 selfDot, 는지 배열의 번호 arr, 와 배열을 반환 상기 각 요소입 광장의 요소에 해당하는 arr.

따:여기에 속 용어로,우리는 하려고 광장의 입력 배열입니다.공식적으로 넣어 우리는 노력을 계산하는 그것은 도로 제품을 자체입니다.

솔루션 2:

var selfDot = function (arr) {
    return arr.map(function (n) {
        return n * n;
    });
};

는 방법입니다 map 상의 forEach?

당신이 사용할 수 있는 map 를 해결하는 모두 작업 작업 1작업 2.그러나 사용할 수 없습니다 forEach 를 해결하기 작업 2.

솔루션 1, 는 경우에,당신은 단순히 교체 forEach by map, 솔루션은 여전히 유효합니다.에 솔루션 2 그러나 교체 map by forEach 하는 것이 이전에 솔루션을 위해 노력하고 있습니다.

구현 forEach 의 측면에서 map:

또 다른 방법을 실현하는 map의 우수성이 구현하는 forEach 의 측면에서 map.우리는 좋은 프로그래머,우리는 것이 없으실에서는 네임스페이스의 오염입니다.우리는 우리의 forEach, 그냥 each.

Array.prototype.each = function (func) {
    this.map(func);
};

지금,당신이 좋아하지 않는 prototype 넌센스,여기에 당신은 이동:

var each = function (arr, func) {
    arr.map(func); // Or map(arr, func);
};

그래서,음..왜가 forEach 에도 존재하는가?

대답은 효율성이다.관심이 없는 경우에는 변형시키는 배열로 또 다른 배열에 왜 당신이 계산하는 변형을 배열?만을 덤프?물론 아닙니다!당신이 원하지 않는 경우는 변신,당신이하지 말아야 할 변화하고 있습니다.

하는 동안 그래서 지도를 해결하는 데 사용할 수 있습니 작업 1,그것은 아마도 안됩니다.각 권리에 대한 후보는.


원래는 대답한다:

는 동안 내가 크게@동의 madlep's 에 대답하고 싶다는 점 map()엄격한 슈퍼 설정forEach().

map() 일반적으로 사용하는 새로 만들의 배열입니다.그러나,그것은 수 있습니다 을 변경하는데 사용될 현재의 배열입니다.

예를 들어 다음과 같습니다.

var a = [0, 1, 2, 3, 4], b = null;
b = a.map(function (x) { a[x] = 'What!!'; return x*x; });
console.log(b); // logs [0, 1, 4, 9, 16] 
console.log(a); // logs ["What!!", "What!!", "What!!", "What!!", "What!!"]

위의 예에서, a 었행되는 a[i] === ii < a.length.그럼에도,그것의 힘을 보여줍 map().

여기에서의 공식적인 설명 map().Note map() 수도 변화 배열에 있는 그것은이라고!우박 map().

희망이었습니다.


편집 10-Nov-2015 년:추가 정교하다.

다음은 Lists를 사용하여 Scala의 예입니다. Map Returns List, Foreach Returns Nothing.

def map(f: Int ⇒ Int): List[Int]
def foreach(f: Int ⇒ Unit): Unit

따라서 맵은 함수 f를 각 목록 요소에 적용하여 목록을 반환합니다.

scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)

scala> list map (x => x * 2)
res0: List[Int] = List(2, 4, 6)

foreach는 각 요소에 f를 적용합니다.

scala> var sum = 0
sum: Int = 0

scala> list foreach (sum += _)

scala> sum
res2: Int = 6 // res1 is empty

특히 JavaScript에 대해 이야기하고 있다면 차이점은 map 루프 기능입니다 forEach 반복자입니다.

사용 map 목록의 각 멤버에게 작업을 적용하고 원래 목록에 영향을 미치지 않고 결과를 새 목록으로 되돌려 놓으려면.

사용 forEach 네가 원할때 하다 목록의 각 요소를 기준으로 무언가. 예를 들어 페이지에 물건을 추가 할 수 있습니다. 본질적으로 "부작용"을 원할 때 좋습니다.

기타 차이점 : forEach 아무것도 반환하지 않으며 (실제로 제어 흐름 함수이므로) 전달 된 함수는 인덱스와 전체 목록에 대한 참조를 가져 오는 반면 맵은 새 목록을 반환하고 현재 요소에서만 전달됩니다.

Foreach는 RDD의 각 요소에 대한 DB 등에 쓰기와 같은 기능을 다시 반환하지 않고 적용하려고합니다.

하지만 map() RDD의 요소에 일부 기능을 적용하고 RDD를 반환합니다. 따라서 아래 메소드를 실행하면 Line3에서 실패하지는 않지만 신청 한 후 RDD를 수집하는 동안 실패하고 오류가 발생합니다.

"파일"u003Cstdin> ", 5 행, INu003Cmodule>

AttributeError : 'Nonetype'객체는 속성이 없습니다 'collect'

nums = sc.parallelize([1,2,3,4,5,6,7,8,9,10])
num2 = nums.map(lambda x: x+2)
print ("num2",num2.collect())
num3 = nums.foreach(lambda x : x*x)
print ("num3",num3.collect())
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top