2017-01-21 1 views
-1

임의 일반 JS (라이브러리 없음)에서 객체/배열 (배열 내)에 배열을 푸는 데 대한 재귀 접근 솔루션입니다. 기본적으로 나는 같은 기능을 자체적으로 보내고 싶다. 이 시점에서 나는 마지막 반복으로 객체를 덮어 쓴다. 내가 얻을 :배열을 객체에 배열합니다. 연속적으로 연속적으로 배열합니다.

{firstName: "Sallito", lastName: "Jordan", age: 16, role: "server"} 

내가 가야하는 동안 :

[ 
    {firstName: 'Eren', lastName: 'Duran', age: 22, role: 'admin'}, 
    {firstName: 'Sallito', lastName: 'Jordan', age: 16, role: 'server'} 
] 

원래의 배열은 다음과 같습니다

var array = [ 
    [ 
     ['firstName', 'Eren'], ['lastName', 'Duran'], ['age', 22], ['role', 'admin'] 
    ], 
    [ 
     ['firstName', 'Sallito'], ['lastName', 'Jordan'], ['age', 16], ['role', 'server'] 
    ] 
]; 

내 현재 SO-까지 솔루션입니다 :

function transformData(array) { 
    var obj = {}; 
    for(var i = 0; i < array.length; i++){   
     for(var j = 0; j < array[i].length; j++){ 
      for(var k = 0; k < array[i][j].length; k++){ 
       if(k === 0){ 
       var currentKey = array[i][j][k]; 
       var currentValue = array[i][j][k + 1]; 
        obj[currentKey] = currentValue; 
       } 
      } 
     } 
    } 
    return obj; 
    } 

제발 제발 재귀 적 아이디어는 각각의 방법으로 수행하고지도를 작성하는 방법을 알고 있기 때문에 재귀 적 아이디어가 필요합니다. 나는 재귀 적 사고를 정말로 배우고 싶다. 감사!

+5

원본 데이터를 추가하십시오. –

+0

.. 또는 재귀 솔루션 ... 다음 : 내 obj 덮어 쓰지 않지만 새 개체를 이전 배열에 추가 할 방법? –

+0

니나, 모두 여기 있습니다 ... 예상 결과, 제 코드와 결과가 나옵니다. 누락되었습니다 : [ [ [firstName ','Eren '], ['lastName ','Duran '], ['age ', 22], ['role ','admin '] [ [ 'firstName', 'Sallito'], [ 'lastName', 'Jordan'], [ 'age', 16], [ 'role', 'server'] ] ] // 죄송합니다. –

답변

0

순수 JS의 경우 다음과 같이 할 수 있습니다.

var data = [ [ ['firstName', 'Eren'], 
 
       ['lastName', 'Duran'], 
 
       ['age', 22], 
 
       ['role', 'admin'] ], 
 
      [ ['firstName', 'Sallito'], 
 
       ['lastName', 'Jordan'], 
 
       ['age', 16], 
 
       ['role', 'server'] ] 
 
      ], 
 
objData = data.map(a => a.reduce((o,t) => Object.assign(o,{[t[0]]:t[1]}),{})); 
 
console.log(objData);

설명 : 우리는 주요 배열을 통해 .map()을 적용하고, 그것을 각 회전에 대한 하나의 콜백 하나의 하위 배열 a 인수에 할당합니다. 그래서 첫 번째로 a입니다; 우리가 물체에 참여하고자 -

[ ['firstName', 'Eren'], 
    ['lastName', 'Duran'], 
    ['age', 22], 
    ['role', 'admin'] ], 

이제 a 서브 어레이 요소 (값 쌍 튜플)으로 배열된다. 따라서 .reduce()a에 적용하면이 작업에 매우 편리합니다.

a.reduce((o,t) => Object.assign(o,{[t[0]]:t[1]}),{}) 

우리 .reduce() 함수는 상기 코드 ...,{})의 마지막 부분 인 초기 값을 취하는 타입이다. 이 처음 비어있는 객체는 콜백의 첫 번째 인수 o에 할당됩니다. ['firstName', 'Eren']과 같은 모든 튜플은 각 턴마다 하나씩 콜백의 두 번째 인수 t에 할당됩니다. 그들은 Object.assign(o,{[t[0]]:t[1]}) 명령의 도움으로 빈 물체에 축적 될 것입니다. 현재 비어있는 값인 o을 가져오고 {firstname: "Eren"}을 병합합니다. 화살표 기능은 다음 번에 사용할 o 값으로 Object.assign()의 출력을 반환합니다. 다음 턴에서

그래서 난 분명히 희망 ... o 지금 {firstname: "Eren"}이다 등 t["lastname", "Duran"]이며 우리가 값을 대체하는 경우 우리가 지금 {firstname: "Eren", lastname: "Duran"}를 반환합니다 Object.assign({firstname: "Eren"},{lastname: "Duran"})을 가지고이 우리의 새로운 o로 반환되며, 지금.

+0

은 재귀가 아닙니다 ... –

+0

@Nina Scholz 주석에서 "재귀 적 솔루션이 없다면 ... 내 obj를 덮어 쓰지 않는 방법 ..." – Redu

+0

이 코드는 작업을 수행하지만, 어떻게 생각하세요. 줄이면 나에게 블랙 박스가 있습니다 : 무엇을, 어떻게하면, 나는 이해하지 못합니다. 나는 Mozzilla에서 o가 accumulator이고 t가 value- 인 것을 읽을 수 있습니다. 그러나 어떻게 그 해결책에 도달 했습니까? 그리고 어떻게 그것을 미리 상상할 수 있었습니까? –

0

재귀 적 솔루션에 대한 확신이 없습니다. (이 특정한 경우에는 필요하지 않다고 생각합니다. 하위 배열에 많은 하위 배열이있는 경우 더 깊은 중첩이 있으면 필요합니다.) 정렬).

현재 솔루션이 거의 작동하지만 두 가지 수정이 필요합니다. 즉, 함수가 시작될 때가 아니라 (즉, 이전 값을 덮어 쓰는 경우가 아니라면) 각 반복마다 새 개체를 만들고 두 번째 수정을해야합니다. .이런 식으로 뭔가 :

var array = [ 
 
    [ 
 
     ['firstName', 'Eren'], ['lastName', 'Duran'], ['age', 22], ['role', 'admin'] 
 
    ], 
 
    [ 
 
     ['firstName', 'Sallito'], ['lastName', 'Jordan'], ['age', 16], ['role', 'server'] 
 
    ] 
 
]; 
 

 
function transform(data) { 
 
output=[]; 
 
data.forEach(function(el) { 
 
obj={}; 
 
for(j=0;j<el.length;j++) { 
 
obj[el[j][0]]=el[j][1]; 
 
} 
 
output.push(obj); 
 
}); 
 
return output; 
 

 
} 
 

 
console.log(transform(array));

추신 : 여기

var array = [ 
 
    [ 
 
     ['firstName', 'Eren'], ['lastName', 'Duran'], ['age', 22], ['role', 'admin'] 
 
    ], 
 
    [ 
 
     ['firstName', 'Sallito'], ['lastName', 'Jordan'], ['age', 16], ['role', 'server'] 
 
    ] 
 
]; 
 
function transformData(array) { 
 
    
 
    final=[]; 
 
    for(var i = 0; i < array.length; i++){ 
 
    var obj = {}; // create new object inside loop -> number of objects, number of arrays 
 
     for(var j = 0; j < array[i].length; j++){ 
 
      for(var k = 0; k < array[i][j].length; k++){ 
 
       if(k === 0){ 
 
       var currentKey = array[i][j][k]; 
 
       var currentValue = array[i][j][k + 1]; 
 
        obj[currentKey] = currentValue; 
 
       } 
 
        
 
      } 
 
     } 
 
     final.push(obj); // push objects into final array 
 
    } 
 
    
 
    return final; 
 
    } 
 
    
 
    console.log(transformData(array));

는 너무 일을 (이럴) 단순화 된 버전입니다 @Redu 대답은 javascript-y보다 많으며 축소는 대단합니다. 물론 이것은 원래 코드에서 잘못된 점을 설명하는 것입니다. ;)

관련 문제