2017-12-18 6 views
0

중첩 배열을 병합하는 JavaScript 함수를 함께 사용했습니다. 그러나이 메서드는 항상 원래 배열을 반환합니다. 예를 들어,이 배열을 [1, 2, 3, [4, 5, [6], [ ] ] ] 배열로 실행하면 해당 배열이 반환됩니다. 나는 줄일 수있는 방법이 있다는 것을 알고 있지만, 논리적 인 이유로이 방법이 작동하지 못하게 막는 것은 무엇입니까? .map을 사용하면 반환 값을 조작하고 재귀 호출을 통해 새 배열 내에서이를 반환 할 수 있어야합니다.Javascript 함수가 제대로 배열 병합되지 않음

function mapper(array) { 
    return array.map((item) => { 
     return (Array.isArray(item)) ? mapper(item) : item 
    } 
)} 
+1

지도를 사용하고 있습니다. Map은'n' 엘리먼트의 배열을 반환합니다. 대신'.reduce'를 사용하십시오. 1 간단한 해킹은'var result = arr.toString(). split (',')' – Rajesh

+0

일 수 있습니다. 배열 자체를 매핑하면됩니다. 단지 자체를 반환 할 것입니다. – Li357

+0

왜 자신에게 매핑됩니까? 그것은 배열이 아닌 숫자 만 리턴해야하는 배열 인 경우 재귀 적으로 함수를 호출합니다. 이 작업을 수행하는 방식의 재귀 호출은 동일한 재귀 호출을 사용합니다. .map을 사용하면 반환 값을 조작하여 새 배열 내에서 반환 할 수 있습니다. – Dog

답변

0

?

var m = [1, 2, 3, [4, 5, [6], []]]; 
function mapper(array) { 
     return array.map((item) => { 
      // for 1,2,3 it will return item 
      // when it sees an array it will again call mapper & map 
      // function will return a new array from it, so map on 
      // [4, 5, [6], []] will return a new array but will not take out 
      // individual element and will put it in previous array 

      return (Array.isArray(item)) ? mapper(item) : item 
     } 
    )} 
mapper(m) 

지도 기능은 원래의 배열 변이하지 않습니다하지만 새로운 배열을 반환합니다.

+0

의 병합을 수행하면 안됩니다. – Dog

+0

네, 그게 가능합니다.'reduce'와 함께,'forEach','concat','spread operator'도 작동합니다. – brk

+0

forEach는 위의 반복문에서 작동하지 않습니다. 반복문을 const로 설정하고 – Dog

0

배열을 자체에 매핑합니다. 기본적으로 map은 입력 요소 수와 정확히 같은 수의 배열을 반환하기 때문에. 당신은 그것을 더 기대할 수 없으므로 배열을 평평하게하기 위해 그것을 사용할 수 없습니다.

대신 감소 사용해야합니다

작동이 방법을 방해하는 논리적 이유가 무엇
function flatten(obj) { 

    if (Array.isArray(obj)) { 
      return obj.reduce((a, b) => a.concat(flatten(b)), []); 
    } else { 
      return [obj]; 
    } 
} 
+1

OP가 대안을 찾고 있지 않습니다. 그/그녀는 * 왜지도가 작동하지 않습니다에 대한 설명을 찾고있다 * – Rajesh

+0

왜 삼항 연산 내에서 재귀 호출 배열 대신 숫자를 반환하지 않는 것이 더 정확한 질문이 될 것입니다. – Dog

+0

감사합니다. 방금 이유를 추가했습니다 –