2017-10-20 1 views
0

루프가 잘못된 용어 일지 모르지만, 제가 시도하고있는 것을 설명합니다. 플랫 데이터에 구조체를 제공하고 싶지만 배열의 위치를 ​​추적해야합니다.Ramda가 배열을 반복합니다.

은 기본적으로 내 규칙 (배열 당)은 다음과 같습니다

  1. 레벨 1은 그것을 항목의 nametypechild 배열을 제공 exists-합니다. 레벨 1이 나타날 때마다 (동일한 배열에서도) 새 항목을 만들어야합니다. NO 레벨 1 그것을 항목의 nametypechild 배열을주지 않으면 exists-

  2. typechild 내부 레벨> 1

  3. 으로 모든 항목을 넣어.

내 코드는 다음 그것이 레벨을보고 배열 매번 생성한다는 것을 제외하고, 거의가 1. 의미 할 것이다 내 예 :

입력 데이터

[ 
    { 
    "title": "Test 1", 
    "type": [{ 
     "name": "Animal", 
     "level": 1 
     }, 
     { 
     "name": "Food", 
     "level": 1 
     }, 
     { 
     "name": "Chicken", 
     "level": 3 
     } 
    ] 
    }, 
    { 
    "title": "Test 2", 
    "type": [{ 
     "name": "Foo", 
     "level": 2 
    }] 
    } 
] 

참고 : 동물과 음식 모두 레벨 1 품목입니다. 그래서

원하는 출력

[ 
    { 
     name: "Animal", 
     typechild: [ 
      { 
       level: 2, 
       name: "Chicken" 
      } 
     ] 
    }, 
    { 
     name: "Food", 
     typechild: [ 
      { 
       level: 2, 
       name: "Chicken" 
      } 
     ] 
    }, 
    { 
     name: "NoName", 
     typechild: [ 
      { 
       level: 2, 
       name: "Foo" 
      } 
     ] 
    } 
] 

Ramda 시도과 같이 두 개의 배열을 ... 만들어야합니다 (여기보십시오 https://dpaste.de/JQHw) :이 같은

const levelEq = (n) => pipe(prop('level'), equals(n)); 
const topLevel = pipe(prop('type'), find(levelEq(1))); 
const topLevelName = pipe(topLevel, propOr('NoName', 'name')); 
const extract2ndLevel = pipe(pluck('type'), flatten, filter(levelEq(2))); 

const convert = pipe(
    groupBy(topLevelName), 
    map(extract2ndLevel), 
    map(uniq), 
    toPairs, 
    map(zipObj(['name', 'typechild'])) 
); 
+0

입니까? 'NoName '은 어디에서 왔습니까? – garajo

답변

1

뭔가? 왜`Chicken` 레벨 2는

var output = [{ 
 
    "name": "Animal", 
 
    "typechild": [{ 
 
    "name": "Chicken", 
 
    "level": 3 
 
    }, { 
 
    "name": "Dog", 
 
    "level": 2 
 
    }] 
 
}, { 
 
    "name": "Food", 
 
    "typechild": [{ 
 
    "name": "Chicken", 
 
    "level": 3 
 
    }] 
 
}, { 
 
    "name": "No name", 
 
    "typechild": [{ 
 
    "name": "Foo", 
 
    "level": 2 
 
    }, { 
 
    "name": "Baz", 
 
    "level": 2 
 
    }] 
 
}] 
 

 

 
let out = {}, 
 
    typechild = {}, 
 
    k; 
 

 
const data = [{ 
 
    "title": "Test 1", 
 
    "type": [{ 
 
    "name": "Animal", 
 
    "level": 1 
 
    }, { 
 
    "name": "Food", 
 
    "level": 1 
 
    }, { 
 
    "name": "Chicken", 
 
    "level": 3 
 
    }] 
 
}, { 
 
    "title": "Test 2", 
 
    "type": [{ 
 
    "name": "Foo", 
 
    "level": 2 
 
    }] 
 
}, { 
 
    "title": "Test 3", 
 
    "type": [{ 
 
    "name": "Baz", 
 
    "level": 2 
 
    }] 
 
}, { 
 
    "title": "Test 4", 
 
    "type": [{ 
 
    "name": "Animal", 
 
    "level": 1 
 
    }, { 
 
    "name": "Dog", 
 
    "level": 2 
 
    }] 
 
}] 
 

 

 
data.forEach((node) => { 
 
    k = false; 
 
    typechild[node.title] = []; 
 
    node.type && node.type.forEach((t, i) => { 
 
    if (t.level == 1) { 
 
     k = true; 
 

 
     !out[t.name] ? out[t.name] = { 
 
     name: t.name, 
 
     typechild: typechild[node.title] 
 
     } : out[t.name].typechild = out[t.name].typechild.concat(typechild[node.title]); 
 
    } else { 
 
     typechild[node.title].push(t); 
 
    } 
 
    if (i == node.type.length - 1 && !k && typechild[node.title].length) { 
 
     out['No name'] = out['No name'] || { 
 
     name: 'No name', 
 
     typechild: [] 
 
     }; 
 

 
     out['No name'].typechild = out['No name'].typechild.concat(typechild[node.title]); 
 
    } 
 
    }); 
 
}); 
 

 
console.log(JSON.stringify(Object.values(out)));

+0

그걸로는 충분하지 않습니다. typechild : 값이 wierd "typechild":/** ref : 3 ** /'like 값을 표시하고 있습니다. 타입 부분이 정확한지 확인해 주시겠습니까? – Ycon

+0

콘솔에서 테스트하십시오. 여기에서는 같은 참조에 대해 불평합니다. – bluehipy

+0

고마워,하지만 계속 정의되지 않고있어! 그것을 시도했다 - https://jsfiddle.net/7pzqb2q2/ – Ycon