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 operator
ES6 의 기능을 사용할 수 있습니다 .
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’는 위의 함수입니다.