예:
var arr = ["one","two","three"];
arr.forEach(function(part){
part = "four";
return "four";
})
alert(arr);
배열은 여전히 원래 값을 가지고 있습니다. 반복 함수에서 배열의 요소에 액세스 할 수있는 방법이 있습니까?
답변
콜백에는 요소, 인덱스 및 배열 자체가 전달됩니다.
arr.forEach(function(part, index, theArray) {
theArray[index] = "hello world";
});
편집 -주석에서 언급했듯이 .forEach()
함수는 두 번째 인수를 취할 수 this
있으며 콜백에 대한 각 호출 의 값으로 사용됩니다 .
arr.forEach(function(part, index) {
this[index] = "hello world";
}, arr); // use arr as this
그 두 번째 예제 프로그램 arr
자체로 설정되고 this
callback.One에서은에 포함 된 배열을 생각할 수 있습니다 .forEach()
통화가 될 수있는 기본 값 this
이지만 그렇지 않은 어떤 이유로,; this
될 것입니다 undefined
그 두 번째 인수가 제공되지 않은 경우.
(참고 : this
콜백이 =>
함수 인 경우 위의 내용은 적용되지 않습니다 . 왜냐하면 this
그러한 함수가 호출 될 때 아무것도 바인딩되지 않기 때문 입니다.)
또한 Array 프로토 타입에 제공되는 유사한 유틸리티가 모두 있다는 점을 기억하는 것이 중요하며, 최상의 솔루션으로 다른 툴을 선택하는 것이 가장 좋습니다. 당신이있어:
forEach
배열의 모든 항목에 대해 또는 모든 항목에 대해 수행filter
적격 항목 만 포함하는 새 배열을 생성하기 위해;map
기존 배열을 변환하여 일대일 새로운 배열을 만들기 위해;some
배열의 적어도 하나의 요소가 어떤 설명에 맞는지 확인하기 위해;every
배열의 모든 항목이 설명과 일치 하는지 확인합니다 .find
배열에서 값을 찾기 위해
등등. MDN 링크
답변
의합시다 시도 간단하게하고 실제로 작동하는 방법을 논의하기 위해. 변수 유형 및 함수 매개 변수와 관련이 있습니다.
우리가 이야기하는 코드는 다음과 같습니다.
var arr = ["one","two","three"];
arr.forEach(function(part) {
part = "four";
return "four";
})
alert(arr);
먼저 Array.prototype.forEach ()에 대해 읽어야합니다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
둘째, JavaScript의 값 유형에 대해 간단히 이야기하겠습니다.
프리미티브 (정의되지 않은, null, 문자열, 부울, 숫자)는 실제 값을 저장합니다.
전의: var x = 5;
참조 유형 (사용자 정의 객체)은 객체의 메모리 위치를 저장합니다.
전의: var xObj = { x : 5 };
셋째, 함수 매개 변수 작동 방식
함수에서 매개 변수는 항상 값으로 전달됩니다.
하므로 arr
문자열의 배열이고, 그 배열의 프리미티브 들이 값에 의해 저장되는 수단 개체.
따라서 위의 코드 foreach는 ()가 반복마다 있음이 수단 part
과 동일한 값과 같은 arr[index]
, 하지만 동일한 개체 .
part = "four";
part
변수 가 변경 되지만 arr
홀로 남겨 집니다.
다음 코드는 원하는 값을 변경합니다.
var arr = ["one","two","three"];
arr.forEach(function(part, index) {
arr[index] = "four";
});
alert(arr);
이제 arr
array가 참조 유형 의 배열 인 경우 참조 유형 은 실제 객체 대신 객체의 메모리 위치를 저장하므로 다음 코드가 작동합니다.
var arr = [{ num : "one" }, { num : "two"}, { num : "three"}];
arr.forEach(function(part, index) {
// part and arr[index] point to the same object
// so changing the object that part points to changes the object that arr[index] points to
part.num = "four";
});
alert(arr[0].num);
alert(arr[1].num);
alert(arr[2].num);
다음 part
은 객체를 arr
단독으로 저장 한 채로 새 객체를 가리 키도록 변경할 수 있음을 보여줍니다 .
var arr = [{ num : "one" }, { num : "two"}, { num : "three"}];
arr.forEach(function(part, index) {
// the following will not change the object that arr[index] points to because part now points at a new object
part = 5;
});
alert(arr[0].num);
alert(arr[1].num);
alert(arr[2].num);
답변
배열 : [1, 2, 3, 4]
결과 :["foo1", "foo2", "foo3", "foo4"]
Array.prototype.map()
원래 배열 유지
const originalArr = ["Iron", "Super", "Ant", "Aqua"];
const modifiedArr = originalArr.map(name => `${name}man`);
console.log( "Original: %s", originalArr );
console.log( "Modified: %s", modifiedArr );
Array.prototype.forEach()
원래 배열 재정의
const originalArr = ["Iron", "Super", "Ant", "Aqua"];
originalArr.forEach((name, index) => originalArr[index] = `${name}man`);
console.log( "Overridden: %s", originalArr );
답변
자바 스크립트 값으로 전달하며, 이는 본질적으로 의미하는 것은 part
A는 복사 배열의 값.
값을 변경하려면 루프에서 배열 자체에 액세스하십시오.
arr[index] = 'new value';
답변
배열의 인덱스로 바꾸십시오.
array[index] = new_value;
답변
=>
스타일 함수 를 사용하는 비슷한 답변이 있습니다.
var data = [1,2,3,4];
data.forEach( (item, i, self) => self[i] = item + 10 );
결과를 제공합니다.
[11,12,13,14]
self
매개 변수 때문에, 화살표 스타일의 기능이 꼭 필요한 것은
data.forEach( (item,i) => data[i] = item + 10);
작동합니다.
답변
.forEach 함수는 콜백 함수 (eachelement, elementIndex)를 가질 수 있습니다. 따라서 기본적으로해야 할 일은 다음과 같습니다.
arr.forEach(function(element,index){
arr[index] = "four"; //set the value
});
console.log(arr); //the array has been overwritten.
또는 원래 배열을 유지하려면 위의 프로세스를 수행하기 전에 사본을 만들 수 있습니다. 복사하려면 다음을 사용하십시오.
var copy = arr.slice();