다음과 같은 JavaScript 배열이 있습니다.
[["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]]
별도의 내부 배열을 다음과 같이 병합하는 방법은 무엇입니까?
["$6", "$12", "$25", ...]
답변
concat
배열을 병합 하는 데 사용할 수 있습니다 .
var arrays = [
["$6"],
["$12"],
["$25"],
["$25"],
["$18"],
["$22"],
["$10"]
];
var merged = [].concat.apply([], arrays);
console.log(merged);
apply
of 메소드를 사용하면 concat
두 번째 매개 변수를 배열로 사용하므로 마지막 줄은 다음과 같습니다.
var merged2 = [].concat(["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]);
Array.prototype.flat()
배열을 평평하게하는 데 사용할 수 있는 방법 (ES2019에 도입 됨)도 있지만 Internet Explorer에서는 버전 11부터 Node.js에서만 사용할 수 있지만 Internet Explorer에서는 전혀 사용할 수 없습니다 .
const arrays = [
["$6"],
["$12"],
["$25"],
["$25"],
["$18"],
["$22"],
["$10"]
];
const merge3 = arrays.flat(1); //The depth level specifying how deep a nested array structure should be flattened. Defaults to 1.
console.log(merge3);
답변
다음은 최신 JavaScript 배열 메소드 중 일부를 사용하여 n 차원 배열을 평탄화하는 간단한 함수입니다.
function flatten(arr) {
return arr.reduce(function (flat, toFlatten) {
return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
}, []);
}
용법:
flatten([[1, 2, 3], [4, 5]]); // [1, 2, 3, 4, 5]
flatten([[[1, [1.1]], 2, 3], [4, 5]]); // [1, 1.1, 2, 3, 4, 5]
답변
혼란스럽게 숨겨져있는 메소드가 있는데,이 메소드는 원래 배열을 변경하지 않고 새 배열을 구성합니다.
var oldArray = [[1],[2,3],[4]];
var newArray = Array.prototype.concat.apply([], oldArray);
console.log(newArray); // [ 1, 2, 3, 4 ]
답변
자바 스크립트 감소 기능으로 가장 잘 수행 할 수 있습니다.
var arrays = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"], ["$0"], ["$15"],["$3"], ["$75"], ["$5"], ["$100"], ["$7"], ["$3"], ["$75"], ["$5"]];
arrays = arrays.reduce(function(a, b){
return a.concat(b);
}, []);
또는 ES2015와 함께 :
arrays = arrays.reduce((a, b) => a.concat(b), []);
답변
이를 위해 flat 이라는 새로운 기본 메소드가 있습니다 .
(2019 년 말 flat
현재 ECMA 2019 표준으로 출판되었으며, core-js@3
(바벨 라이브러리)는 해당 폴리 필 라이브러리 에 포함합니다 )
const arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]
const arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]
// Flatten 2 levels deep
const arr3 = [2, 2, 5, [5, [5, [6]], 7]];
arr3.flat(2);
// [2, 2, 5, 5, 5, [6], 7];
// Flatten all levels
const arr4 = [2, 2, 5, [5, [5, [6]], 7]];
arr4.flat(Infinity);
// [2, 2, 5, 5, 5, 6, 7];
답변
여기의 대부분의 답변은 거대한 (예 : 200,000 요소) 배열에서는 작동하지 않으며 그렇게하더라도 느립니다. polkovnikov.ph의 답변 이 최고의 성능을 발휘하지만 심층 평 평화에는 효과가 없습니다.
다음은 가장 빠른 솔루션이며 여러 수준의 중첩이있는 배열에서도 작동합니다 .
const flatten = function(arr, result = []) {
for (let i = 0, length = arr.length; i < length; i++) {
const value = arr[i];
if (Array.isArray(value)) {
flatten(value, result);
} else {
result.push(value);
}
}
return result;
};
예
거대한 배열
flatten(Array(200000).fill([1]));
거대한 배열을 잘 처리합니다. 내 컴퓨터 에서이 코드는 실행하는 데 약 14ms가 걸립니다.
중첩 배열
flatten(Array(2).fill(Array(2).fill(Array(2).fill([1]))));
중첩 배열과 함께 작동합니다. 이 코드는를 생성합니다 [1, 1, 1, 1, 1, 1, 1, 1]
.
다른 수준의 중첩을 가진 배열
flatten([1, [1], [[1]]]);
이와 같은 배열을 병합하는 데 아무런 문제가 없습니다.
답변
업데이트 :이 솔루션은 대형 배열에서 작동하지 않는 것으로 나타났습니다. 더 빠르고 더 나은 솔루션을 찾고 있다면 이 답변을 확인하십시오 .
function flatten(arr) {
return [].concat(...arr)
}
단순히 확장 arr
하여 인수로 전달하여 concat()
모든 배열을 하나로 병합합니다. 와 같습니다 [].concat.apply([], arr)
.
깊은 평평을 위해 이것을 시도 할 수도 있습니다.
function deepFlatten(arr) {
return flatten( // return shalowly flattened array
arr.map(x=> // with each x in array
Array.isArray(x) // is x an array?
? deepFlatten(x) // if yes, return deeply flattened x
: x // if no, return just x
)
)
}
JSBin 데모를 참조하십시오 .
이 답변에 사용 된 ECMAScript 6 요소에 대한 참조 :
참고 사항 : find()
및 화살표 기능 과 같은 방법 이 모든 브라우저에서 지원되는 것은 아니지만 지금이 기능을 사용할 수는 없습니다. Babel 만 사용 하면 ES6 코드가 ES5로 변환됩니다.