[javascript] 배열 항목을 다른 배열로 복사

dataArray새 배열로 푸시하려는 JavaScript 배열 이 newArray있습니다. 내가 원하지 않는 제외시켰다 newArray[0]것으로 dataArray. 모든 항목을 새 배열로 푸시하고 싶습니다.

var newArray = [];

newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...

또는 더 나은 :

var newArray = new Array (
   dataArray1.values(),
   dataArray2.values(),
   // ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);

이제 새 배열에는 개별 데이터 배열의 모든 값이 포함됩니다. pushValues사용할 수있는 것과 같은 속기가 있습니까? 그래서 각 개인을 반복 할 필요 dataArray없이 항목을 하나씩 추가합니까?



답변

다음과 같이 concat 함수를 사용하십시오 .

var arrayA = [1, 2];
var arrayB = [3, 4];
var newArray = arrayA.concat(arrayB);

의 값이 newArray될 것이다 [1, 2, 3, 4]( arrayA그리고 arrayB변하지; concat결과를위한 새로운 배열을 생성 및 리턴).


답변

배열이 크지 않은 경우 (아래주의 사항 참조) push()값을 추가 할 배열 의 방법을 사용할 수 있습니다 . push()여러 매개 변수를 사용할 수 있으므로 해당 apply()메서드를 사용하여 함수 매개 변수 목록으로 푸시 할 값 배열을 전달할 수 있습니다 . 이것은 concat()새로운 배열을 생성하는 대신 배열에 요소를 추가하는 것보다 장점이 있습니다 .

그러나 10 만 명 이상의 대규모 배열의 경우이 트릭이 실패 할 수 있습니다. 이러한 배열의 경우 루프를 사용하는 것이 더 좋습니다. 자세한 내용은 https://stackoverflow.com/a/17368101/96100 을 참조하십시오.

var newArray = [];
newArray.push.apply(newArray, dataArray1);
newArray.push.apply(newArray, dataArray2);

이것을 함수로 일반화하고 싶을 수도 있습니다.

function pushArray(arr, arr2) {
    arr.push.apply(arr, arr2);
}

… 또는 Array프로토 타입에 추가하십시오 .

Array.prototype.pushArray = function(arr) {
    this.push.apply(this, arr);
};

var newArray = [];
newArray.pushArray(dataArray1);
newArray.pushArray(dataArray2);

… 또는 원래 에뮬레이트 push()사실하여 여러 파라미터시킴으로써 방법 concat()push()여러 파라미터를 허용 :

Array.prototype.pushArray = function() {
    this.push.apply(this, this.concat.apply([], arguments));
};

var newArray = [];
newArray.pushArray(dataArray1, dataArray2);

다음 예제는 IE <= 8을 포함하여 모든 대형 브라우저 및 모든 주요 브라우저에 적합한 마지막 예제의 루프 기반 버전입니다.

Array.prototype.pushArray = function() {
    var toPush = this.concat.apply([], arguments);
    for (var i = 0, len = toPush.length; i < len; ++i) {
        this.push(toPush[i]);
    }
};


답변

“미래에 대비 한”답장을 하나 더 추가하겠습니다

ECMAScript 6에서는 Spread 구문을 사용할 수 있습니다 .

let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1.push(...arr2);

console.log(arr1)

스프레드 구문은 아직 모든 주요 브라우저에 포함되어 있지 않습니다. 현재 호환성에 대해서는이 (지속적으로 업데이트 된) 호환성 표를 참조하십시오 .

그러나 Babel.js 와 함께 스프레드 구문을 사용할 수 있습니다 .

편집하다:

성능에 대한 자세한 설명은 아래 Jack Giffin의 답변을 참조하십시오. concat이 스프레드 연산자보다 여전히 낫고 빠릅니다.


답변

MDN 에서 우아한 길을 찾았습니다

var vegetables = ['parsnip', 'potato'];
var moreVegs = ['celery', 'beetroot'];

// Merge the second array into the first one
// Equivalent to vegetables.push('celery', 'beetroot');
Array.prototype.push.apply(vegetables, moreVegs);

console.log(vegetables); // ['parsnip', 'potato', 'celery', 'beetroot']

또는 spread operatorES6 의 기능을 사용할 수 있습니다 .

let fruits = [ 'apple', 'banana'];
const moreFruits = [ 'orange', 'plum' ];

fruits.push(...moreFruits); // ["apple", "banana", "orange", "plum"]


답변

var a=new Array('a','b','c');
var b=new Array('d','e','f');
var d=new Array('x','y','z');
var c=a.concat(b,d)

그게 당신의 문제를 해결합니까?


답변

다음은 나에게 가장 간단한 것 같습니다.

var newArray = dataArray1.slice();
newArray.push.apply(newArray, dataArray2);

“push”는 가변 개수의 인수를 취 apply하므로 push함수 의 메소드를 사용하여 다른 배열의 모든 요소를 ​​푸시 할 수 있습니다 . 첫 번째 인수 (여기서는 “newArray”)를 “this”로, 배열의 요소를 나머지 인수로 사용하여 푸시하는 호출을 구성합니다.

slice첫 번째 문에서 첫 번째 배열의 복사본을 얻는다, 그래서 당신은 그것을 수정하지 마십시오.

업데이트 슬라이스를 사용할 수있는 자바 스크립트 버전을 사용하는 경우 다음과 같이 push표현을 단순화 할 수 있습니다 .

newArray.push(...dataArray2)


답변

아래 함수는 배열 길이에 문제가 없으며 모든 제안 된 솔루션보다 성능이 우수합니다.

function pushArray(list, other) {
    var len = other.length;
    var start = list.length;
    list.length = start + len;
    for (var i = 0; i < len; i++ , start++) {
        list[start] = other[i];
    }
}

불행히도 jspref는 내 제출을 수락하지 않으므로 다음은 benchmark.js를 사용한 결과입니다.

        Name            |   ops/sec   |  ± %  | runs sampled
for loop and push       |      177506 |  0.92 | 63
Push Apply              |      234280 |  0.77 | 66
spread operator         |      259725 |  0.40 | 67
set length and for loop |      284223 |  0.41 | 66

어디

for 루프 앤 푸시는 다음과 같습니다.

    for (var i = 0, l = source.length; i < l; i++) {
        target.push(source[i]);
    }

적용을 누릅니다.

target.push.apply(target, source);

스프레드 연산자 :

    target.push(...source);

마지막으로 ‘set length and for loop’는 위의 함수입니다.