Javascript에서 배열의 시작 부분에 새 배열 요소를 추가하려면 어떻게해야합니까?


1585

배열의 시작 부분에 요소를 추가하거나 추가해야합니다.

예를 들어 내 배열이 다음과 같은 경우

[23, 45, 12, 67]

그리고 내 AJAX 호출의 응답은입니다 34. 업데이트 된 배열이 다음과 같기를 원합니다.

[34, 23, 45, 12, 67]

현재 다음과 같이 할 계획입니다.

var newArray = [];
newArray.push(response);

for (var i = 0; i < theArray.length; i++) {
    newArray.push(theArray[i]);
}

theArray = newArray;
delete newArray;

더 좋은 방법이 있습니까? Javascript에는이를 수행하는 내장 기능이 있습니까?

내 방법의 복잡성 O(n)은 더 나은 구현을 보는 것이 정말 흥미로울 것입니다.


9
참고 : 배열의 시작 부분에 요소를 지속적으로 삽입 해야하는 경우 항상 push호출하는 reverse대신 문을 호출하고을 호출 하는 것이 더 빠릅니다 unshift.
Jenny O'Reilly

2
@ JennyO'Reilly 당신은 이것을 답변으로 게시해야합니다. 내 유스 케이스와 완벽하게 일치했습니다. 감사합니다
rob

2
성능 테스트 : jsperf.com/adding-element-to-the-array-start 그러나 결과는 브라우저마다 다릅니다.
Avernikoz

답변:


2811

사용하십시오 unshift. 마치 push배열 대신 배열의 시작 부분에 요소를 추가한다는 점을 제외하면 같습니다 .

  • unshift/ push-배열의 시작 / 끝에 요소 추가
  • shift/ pop -배열의 첫 번째 / 마지막 요소를 제거하고 반환

간단한 다이어그램 ...

   unshift -> array <- push
   shift   <- array -> pop

및 차트 :

          add  remove  start  end
   push    X                   X
    pop           X            X
unshift    X             X
  shift           X      X

MDN 어레이 설명서를 확인하십시오 . 배열에서 요소를 푸시 / 팝핑 할 수있는 거의 모든 언어에는 요소를 이동 / 이동 (때로는 push_front/ 라고도 함 pop_front) 할 수있는 기능이 있으므로 직접 구현할 필요는 없습니다.


주석에서 지적했듯이 원래 배열을 변경하지 않으려면을 사용 concat하면 두 개 이상의 배열을 함께 연결할 수 있습니다. 이를 사용하여 단일 요소를 기능적으로 기존 어레이의 앞면 또는 뒷면에 밀어 넣을 수 있습니다. 이렇게하려면 새 요소를 단일 요소 배열로 바꿔야합니다.

const array = [ 3, 2, 1 ]

const newFirstElement = 4

const newArray = [newFirstElement].concat(array) // [ 4, 3, 2, 1 ]

concat항목을 추가 할 수도 있습니다. 인수 concat는 모든 유형이 될 수 있습니다. 배열이 아닌 경우 단일 요소 배열에 내재적으로 래핑됩니다.

const array = [ 3, 2, 1 ]

const newLastElement  = 0

// Both of these lines are equivalent:
const newArray1 = array.concat(newLastElement)   // [ 3, 2, 1, 0 ]
const newArray2 = array.concat([newLastElement]) // [ 3, 2, 1, 0 ]

51
concat새 배열을 반환하므로 사용 하는 것이 좋습니다. 체인에 매우 유용합니다. [thingToInsertToFront].concat(originalArray).reduce(fn).reverse().map(fn)etc ...을 사용 unshift하면 길이 만 있기 때문에 체인을 연결할 수 없습니다.
StJohn3D

4
시프트 / 언 시프트, 푸시 / 팝, 스플 라이스. 그러한 방법에 대한 매우 논리적 이름.
linuxunil

1396

배열 연산 이미지

var a = [23, 45, 12, 67];
a.unshift(34);
console.log(a); // [34, 23, 45, 12, 67]


117
사람들이 일상적으로 사용하는 4 가지 기능에 대한 시각적 지침이 필요한 이유는 암호화 된 기능 이름 때문입니다. 왜 Unshift가 Insert라고 불리지 않습니까? Shift는 제거해야합니다. etc ...
Pascal

76
// Unshift가 왜 Insert라고 불리지 않는가? // 배열 요소가 스택처럼 취급되는 C 프로그래밍 언어의 규칙에서 비롯됩니다. ( 전체 설명 은 perlmonks.org/?node_id=613129 참조 )
dreftymac

25
@Pascal 아니오, 삽입 및 제거는 특히 잘못된 이름입니다. 그것들은 어레이의 앞면에서 추가 / 제거하는 대신 무작위 접근을 의미합니다
meagar

25
나는 unshift가 첫 번째 키를 제거해야한다고 생각했을 것이고 shift는 첫 번째 키에 삽입 될 것이지만 그것은 나의 일반적인 생각입니다
Shannon Hochkins

27
나는 DNA 참조를 좋아한다
Hunter WebDev

235

ES6에서는 스프레드 연산자를 사용하십시오 ....

데모

var arr = [23, 45, 12, 67];
arr = [34, ...arr]; // RESULT : [34,23, 45, 12, 67]

console.log(arr)


19
또한 순수한 함수에 유용한 새로운 배열을 만듭니다
devonj

여기서 성능의 의미는 무엇입니까? unshift ()를 사용하는 것보다 속도가 느립니까?
Peter T.

1
물론, 불변 배열이기 때문에 속도가 느려집니다 (새 배열 만들기). 큰 배열로 작업하거나 성능이 첫 번째 요구 사항 인 경우 concat대신 사용하는 것이 좋습니다.
Abdennour TOUMI

성능이 2018 년 중요하지 않습니다, 브라우저와 노드의 새로운 버전은 동일한 성능을 얻을
stackdave

75

이를 수행하는 또 다른 방법 concat

var arr = [1, 2, 3, 4, 5, 6, 7];
console.log([0].concat(arr));

의 차이 concat와는 unshiftconcat반환 새로운 배열. 그들 사이의 성능은 여기 에서 찾을 수 있습니다 .

function fn_unshift() {
  arr.unshift(0);
  return arr;
}

function fn_concat_init() {
  return [0].concat(arr)
}

테스트 결과는 다음과 같습니다

여기에 이미지 설명을 입력하십시오


참조 추가와 별도로 성능 비교를 추가하는 것이 좋습니다.
Ivan De Paz Centeno 2016 년

난 그냥 가지고 우리가 V2를 해제 작업을하는 동안 jsPerf를 일시적으로 사용할 수 없습니다. 나중에 링크에서 다시 시도하십시오 . 결과를 연결하는 대신 포함시키는 또 다른 좋은 이유입니다.
Tigger

jsPref 결과 : unshift: 25,510 ± 3.18 % 99 % 느림 concat: 2,436,894 ± 3.39 % 빠름
일루미네이터

최신 Safari에서는 fn_unshift ()가 더 빠르게 실행됩니다.
passatgt

최신 Safari (v 10)에서 fn_unshift ()가 다시 느려집니다.
rmcsharry

45

빠른 치트 시트 :

시프트 / 언 시프트 및 푸시 / 팝이라는 용어는 적어도 C로 프로그래밍에 익숙하지 않은 사람들에게는 약간 혼란 스러울 수 있습니다.

링고에 익숙하지 않은 경우 다음과 같은 대체 용어를 빠르게 번역하여 기억하기가 더 쉽습니다.

* array_unshift()  -  (aka Prepend ;; InsertBefore ;; InsertAtBegin )     
* array_shift()    -  (aka UnPrepend ;; RemoveBefore  ;; RemoveFromBegin )

* array_push()     -  (aka Append ;; InsertAfter   ;; InsertAtEnd )     
* array_pop()      -  (aka UnAppend ;; RemoveAfter   ;; RemoveFromEnd ) 

20

배열이 있습니다. var arr = [23, 45, 12, 67];

처음에 항목을 추가하려면 다음을 사용하십시오 splice.

var arr = [23, 45, 12, 67];
arr.splice(0, 0, 34)
console.log(arr);


arr.splice (0, arr.length, 34);
Lior Elrom

1
@LiorElrom 스 니펫은 무엇을합니까?
야누스 트롤 슨

@poushy Firefox 54에서 브라우저별로 다르지만 unshift50 % 더 빠릅니다 (그러나 대부분 더 읽기
쉽습니다

@poushy 더 이상은 아닙니다. 천천히.
앤드류

17

돌연변이없이

실제로 모든 unshift/ pushshift/ 는 원점 배열을 pop 변경 합니다.

unshift/ push시작 / 끝에서 존재 배열에 항목을 추가 shift/ pop배열의 시작 / 끝에서 항목을 제거합니다.

그러나 돌연변이없이 배열에 항목을 추가하는 방법은 거의 없습니다. 결과는 배열의 끝에 추가하기 위해 새 배열입니다. 아래 코드를 사용하십시오.

const originArray = ['one', 'two', 'three'];
const newItem = 4;

const newArray = originArray.concat(newItem); // ES5
const newArray2 = [...originArray, newItem]; // ES6+

원래 배열의 시작 부분에 추가하려면 아래 코드를 사용하십시오.

const originArray = ['one', 'two', 'three'];
const newItem = 0;

const newArray = (originArray.slice().reverse().concat(newItem)).reverse(); // ES5
const newArray2 = [newItem, ...originArray]; // ES6+

위의 방법으로, 돌연변이없이 배열의 시작 / 끝에 추가합니다.


나는 그것이 변이를 막기 위해 slice끝에 함수를 넣었습니다 originArray.
Ahmad Khani

1
대박! (Redux) State management에 관해서는 ...이 답변은 소중합니다!
페드로 페레이라

1
이것이 올바른 방법입니다!
mmm

10

ES6 파괴 사용 : (원래 배열에서 돌연변이 피하기)

const newArr = [item, ...oldArr]



8

배열의 시작 부분에 요소를 지속적으로 삽입해야하는 경우 항상 push호출하는 reverse대신 문을 호출하고을 호출 하는 것이 더 빠릅니다 unshift.

벤치 마크 테스트 : http://jsben.ch/kLIYf


1
참고 : 초기 배열은 비어 있어야합니다.
192kb

5

사용하여 splice우리가 begnning에서 배열에 요소를 삽입합니다 :

arrName.splice( 0, 0, 'newName1' );

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