배열에서 두 요소를 바꾸는 더 간단한 방법이 있습니까?
var a = list[x], b = list[y];
list[y] = a;
list[x] = b;
답변
임시 변수는 하나만 필요합니다.
var b = list[y];
list[y] = list[x];
list[x] = b;
10 년 후 벨트에서 많은 ES6 채택을 통해 도용 최고 답변을 수정합니다 .
array가 주어지면 다음 arr = [1,2,3,4]
과 같이 한 줄로 값을 바꿀 수 있습니다.
[arr[0], arr[1]] = [arr[1], arr[0]];
이것은 배열을 생성합니다 [2,1,3,4]
. 이것은 할당을 파괴하고 있습니다.
답변
기본 자바 스크립트를 사용하여 단일 표현식을 원하는 경우 스플 라이스 연산의 반환 값에 제거 된 요소가 포함되어 있음을 기억하십시오.
var A = [1, 2, 3, 4, 5, 6, 7, 8, 9], x= 0, y= 1;
A[x] = A.splice(y, 1, A[x])[0];
alert(A); // alerts "2,1,3,4,5,6,7,8,9"
편집하다:
는 [0]
같은 식의 끝 부분에 필요한 Array.splice()
반환 배열,이 상황에서 우리는 반환 된 배열의 단일 요소를 필요로한다.
답변
이것은 괜찮아 보인다 ….
var b = list[y];
list[y] = list[x];
list[x] = b;
Howerver 사용
var b = list[y];
는 b 변수가 나머지 범위에 대해 존재 함을 의미합니다. 이로 인해 메모리 누수가 발생할 수 있습니다. 가능하지는 않지만 피하는 것이 좋습니다.
이것을 Array.prototype.swap에 넣는 것이 좋습니다.
Array.prototype.swap = function (x,y) {
var b = this[x];
this[x] = this[y];
this[y] = b;
return this;
}
다음과 같이 호출 할 수 있습니다.
list.swap( x, y )
이것은 메모리 누수 와 DRY를 피하는 깔끔한 접근 방법 입니다.
답변
에 따르면 Metafilter에 어떤 임의의 사람 , “자바 스크립트의 최신 버전은 훨씬 더 깔끔하게 (다른 것들 사이) 교환을 할 수 있도록”
[ list[x], list[y] ] = [ list[y], list[x] ];
빠른 테스트에서이 Python 코드 는 현재 “Google Apps Script”( “. gs”)에서 사용되는 JavaScript 버전에서 훌륭하게 작동합니다. 아아, 추가 테스트에 따르면이 코드는 “Uncaught ReferenceError : Assignment in invalid left-side side in assignment”를 보여줍니다. 모든 버전의 JavaScript ( “. js”)에서 Chrome 버전 24.0.1312.57 m이 사용됩니다.
답변
음, 두 값을 모두 버퍼링 할 필요는 없습니다 . 하나만 :
var tmp = list[x];
list[x] = list[y];
list[y] = tmp;
답변
다음과 같은 방법으로 배열의 요소를 교체 할 수 있습니다.
list[x] = [list[y],list[y]=list[x]][0]
다음 예를 참조하십시오.
list = [1,2,3,4,5]
list[1] = [list[3],list[3]=list[1]][0]
//list is now [1,4,3,2,5]
참고 : 일반 변수와 동일한 방식으로 작동합니다.
var a=1,b=5;
a = [b,b=a][0]
답변
숫자 값을 사용하면 비트 xor를 사용하여 임시 변수를 피할 수 있습니다
list[x] = list[x] ^ list[y];
list[y] = list[y] ^ list[x];
list[x] = list[x] ^ list[y];
또는 산술 합계 (x + y가 데이터 유형의 최대 값보다 작은 경우에만 작동 함)
list[x] = list[x] + list[y];
list[y] = list[x] - list[y];
list[x] = list[x] - list[y];