[javascript] 배열 배열 병합 / 평평하게하기

다음과 같은 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);

applyof 메소드를 사용하면 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), []);

JS 바이올린

모질라 문서


답변

이를 위해 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로 변환됩니다.