포어치 실행 시 배열 값 변경
예:
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";
});
edit : 코멘트에서 설명한 바와 같이.forEach()
는 두 인수를 할 수 , 두 인수는 "인수"의 값으로 됩니다.이 인수는 다음 값으로 사용됩니다.this
「 」 、 「 」
arr.forEach(function(part, index) {
this[index] = "hello world";
}, arr); // use arr as this
는 " " 입니다.arr
가 「」로서 있다.this
콜백에 포함되어 있습니다.은 이 배열과 된 것이라고 할 수 ..forEach()
콜이 디폴트값일 수 있습니다.this
하지만 어떤 이유로든 그렇지 않다.this
되다undefined
두두 、 수수인인인지 경경경 。
(주의: 위의 내용에 대해서)this
는, 이 「콜백」인되지 않습니다.=>
왜냐하면, 「」, 「」이기 때문입니다.this
이러한 기능이 호출되었을 때는, 어떠한 것에도 구속되지 않습니다.
또한 어레이 프로토타입에는 유사한 유틸리티 패밀리가 모두 제공되고 있으며 Stackoverflow에는 여러 가지 기능에 대한 많은 질문이 나타나기 때문에 최적의 해결책은 단순히 다른 도구를 선택하는 것입니다.다음과 같은 기능이 있습니다.
forEach
내의 엔트리에 대해 할 수 .filter
적격 엔트리만을 포함한 새로운 어레이를 작성하기 위한 것.map
어레이를 .some
배열 중 하나 이상의 요소가 설명에 적합한지 여부를 확인합니다.every
배열 내의 모든 엔트리가 설명과 일치하는지 확인합니다.find
에서
기타 등등.MDN 링크
단순하게 하고 실제로 어떻게 작동하는지 논의해 봅시다.변수 유형 및 함수 매개 변수와 관련이 있습니다.
다음은 고객님의 코드입니다.
var arr = ["one","two","three"];
arr.forEach(function(part) {
part = "four";
return "four";
})
alert(arr);
먼저 Array.protype에 대해 읽어보시기 바랍니다.Each()의 경우
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
variable, 단, 그대로 남습니다.arr
discloss.discloss.
다음 코드는 원하는 값을 변경합니다.
var arr = ["one","two","three"];
arr.forEach(function(part, index) {
arr[index] = "four";
});
alert(arr);
의 arr
는 참조 유형의 배열입니다. 참조 유형은 실제 개체가 아닌 개체의 메모리 위치를 저장하기 때문에 다음 코드가 작동합니다.
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
배열의 값의 복사본입니다.
당신의 루프의 값을 변경하려면, 액세스가 배열 자체.
arr[index] = 'new value';
'을 했을 때, a를 사용했을 때,=>
다음 중 하나:
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);
또한 일한다.
배열의 지수로 교체하라.
array[index] = new_value;
그 .forEach 기능은 콜백 함수(eachelement, 요소를 가질 수 있다.지수 0그래서 기본적으로 중요한 것은:필요한 거지.
arr.forEach(function(element,index){
arr[index] = "four"; //set the value
});
console.log(arr); //the array has been overwritten.
원본 배열을 유지하기를 원하신다면, 여러분이 위의 과정을 하기 전에 그것의 복사본을 만들 수 있다.복사본을 만드려면:사용할 수 있다.
var copy = arr.slice();
또는 삭제하 slice()의zhujy_8833 제안은 책을 반복하는 데 연장의 방법에 의해, 단지 당신이 이미 하지 않거나, 또는 추가하고, 그에 따라 지수를 삭제해 요소의 수를 세는 색인을 바꾸고 요소를 추가하려면.예를 들어:요소를 삭제한다.
let values = ["A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8"];
let count = 0;
values.slice().forEach((value, index) => {
if (value === "A2" || value === "A5") {
values.splice(index - count++, 1);
};
});
console.log(values);
// Expected: [ 'A0', 'A1', 'A3', 'A4', 'A6', 'A7', 'A8' ]
전에 요소를 삽입하려면:
if (value === "A0" || value === "A6" || value === "A8") {
values.splice(index - count--, 0, 'newVal');
};
// Expected: ['newVal', A0, 'A1', 'A2', 'A3', 'A4', 'A5', 'newVal', 'A6', 'A7', 'newVal', 'A8' ]
뒤에 요소를 삽입하려면:
if (value === "A0" || value === "A6" || value === "A8") {
values.splice(index - --count, 0, 'newVal');
};
// Expected: ['A0', 'newVal', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'newVal', 'A7', 'A8', 'newVal']
요소를 교체하려면:
if (value === "A3" || value === "A4" || value === "A7") {
values.splice(index, 1, 'newVal');
};
// Expected: [ 'A0', 'A1', 'A2', 'newVal', 'newVal', 'A5', 'A6', 'newVal', 'A8' ]
참고: 'before' 및 'after' 삽입을 모두 구현하는 경우 코드가 'before' 삽입을 먼저 처리해야 하며, 그렇지 않으면 예상과 다르게 처리되지 않습니다.
Array 객체 메서드를 사용하면 기본 루프와 비교하여 Array 콘텐츠를 수정할 수 있습니다.이러한 메서드에는 중요한 기능이1개 결여되어 있습니다.실행 시 인덱스는 수정할 수 없습니다.
예를 들어 현재 요소를 제거하고 동일한 배열 내의 다른 인덱스 위치에 배치하는 경우 쉽게 이 작업을 수행할 수 있습니다.현재 요소를 이전 위치로 이동하면 다음 반복 시 문제가 없습니다. 아무것도 하지 않은 것처럼 동일한 다음 항목이 표시됩니다.
인덱스가 최대 5까지 카운트되면 인덱스 위치 5의 항목을 인덱스 위치 2로 이동하는 이 코드를 고려하십시오.
var ar = [0,1,2,3,4,5,6,7,8,9];
ar.forEach((e,i,a) => {
i == 5 && a.splice(2,0,a.splice(i,1)[0])
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9
그러나 현재 요소를 현재 인덱스 위치보다 더 높은 위치로 이동하면 상황이 약간 복잡해집니다.그런 다음 바로 다음 항목은 이동된 항목 위치로 이동하고 다음 반복에서는 항목을 보거나 평가할 수 없습니다.
인덱스가 최대 5까지 카운트되면 인덱스 위치 5의 항목을 인덱스 위치 7로 이동하는 이 코드를 고려하십시오.
var a = [0,1,2,3,4,5,6,7,8,9];
a.forEach((e,i,a) => {
i == 5 && a.splice(7,0,a.splice(i,1)[0])
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 7 - 7 5 - 8 8 - 9 9
그래서 우리는 루프에서 6을 만난 적이 없다.일반적으로 for 루프에서는 다음 실행에서 인덱스가 동일한 위치에 유지되도록 배열 항목을 앞으로 이동하면 인덱스 값이 감소해야 하며 제거된 항목 위치로 이동한 항목을 평가할 수 있습니다.어레이 메서드에서는 이 작업을 수행할 수 없습니다.인덱스는 변경할 수 없습니다.다음 코드를 확인합니다.
var a = [0,1,2,3,4,5,6,7,8,9];
a.forEach((e,i,a) => {
i == 5 && (a.splice(7,0,a.splice(i,1)[0]), i--);
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 4 5 - 6 7 - 7 5 - 8 8 - 9 9
감소하면 알 수 있듯이i
원래 있던 곳에서 5시부터 6시까지 계속됩니다.
그러니 명심하세요.
재지정하려면 이 방법을 사용할 수 있습니다.
var newArray= [444,555,666];
var oldArray =[11,22,33];
oldArray.forEach((name, index) => oldArray [index] = newArray[index]);
console.log(newArray);
항목을 제거하려는 경우
변경해야 할 경우 목록에서 하나 이상의 항목을 완전히 삭제해야 합니다.for
루프와 루프 사이를 거꾸로 이동합니다.
for (let i = myArray.length - 1; i >= 0; i--)
{
const item = myArray[i];
if (...)
{
// remove item
// https://stackoverflow.com/questions/5767325/how-can-i-remove-a-specific-item-from-an-array?rq=1
}
};
뒤로 이동하면 각 항목의 배열이 변경되지 않습니다.루프를 통해 앞으로 나아가서 삭제하려는 경우item[3]
item[4]
★★★★★★★★★★★★★★★★★★★.item[3]
그건 아무것도 쉽게 만들 수 없어.이데올로기 때문에
이것은 물론 포어치를 사용하지 않는 해결책이지만, 종종 '구식' 방식이 최선일 수 있다는 것을 기억하는 것이 중요하다. 어떤 로든 당신이 한 break;
for 루프는 for 루프를 분리할 수 없기 때문에 보다 효율적입니다.
언급URL : https://stackoverflow.com/questions/12482961/change-values-in-array-when-doing-foreach
'itsource' 카테고리의 다른 글
두 변수의 값을 교환하기 위한 PHP 함수가 있습니까? (0) | 2022.09.28 |
---|---|
MYSQL - 경고: #1681 정수 표시 너비는 권장되지 않습니다. (0) | 2022.09.28 |
NumPy 어레이를 다른 NumPy 어레이에 연결합니다. (0) | 2022.09.28 |
PHP에서 REST API 호출 (0) | 2022.09.28 |
INT에 십진법 주조 (0) | 2022.09.28 |