2016-07-21 2 views
1

Я хочу размотать массив объектов, у которых есть массивы объектов, вложенных. Уровень вложенности не определен и не согласован по всему массиву.Как отключить массив объектов в NodeJS?

Вот мои выборочные данные

var data = [{ 
    id: 1, 
    name: 'Harshal', 
    subjects: [{ 
     id: 1, 
     name: 'English', 
     chapters: [{ 
      id: 1, 
      name: 'Grammar' 
     }, { 
      id: 2, 
      name: 'Comprehension' 
     }] 
    }, { 
     id: 2, 
     name: 'Maths', 
     chapters: [{ 
      id: 1, 
      name: 'Algebra' 
     }, { 
      id: 2, 
      name: 'Geometry' 
     }] 
    }] 
}, { 
    id: 2, 
    name: 'Pankaj', 
    subjects: [{ 
     id: 3, 
     name: 'Marathi', 
     chapters: [{ 
      id: 1, 
      name: 'Kavita', 
      topics: [{ 
       id: 1, 
       name: 'Topic 1' 
      }] 
     }] 
    }, { 
     id: 4, 
     name: 'Hindi', 
     chapters: [{ 
      id: 1, 
      name: 'Katha', 
      topics: [{ 
       id: 2, 
       name: 'Topic 2' 
      }, { 
       id: 3, 
       name: 'Topic 3' 
      }] 
     }] 
    }] 
}]; 

Я хочу, чтобы получить результат, как это:

var op = [{ 
    id: 1, 
    name: 'Harshal', 
    subjects: { 
     id: 1, 
     name: 'English', 
     chapters: { 
      id: 1, 
      name: 'Grammar' 
     } 
    } 
}, { 
    id: 1, 
    name: 'Harshal', 
    subjects: { 
     id: 1, 
     name: 'English', 
     chapters: { 
      id: 2, 
      name: 'Comprehension' 
     } 
    } 
}, { 
    id: 1, 
    name: 'Harshal', 
    subjects: { 
     id: 2, 
     name: 'Maths', 
     chapters: { 
      id: 1, 
      name: 'Algebra' 
     } 
    } 
}, { 
    id: 1, 
    name: 'Harshal', 
    subjects: { 
     id: 2, 
     name: 'Maths', 
     chapters: { 
      id: 2, 
      name: 'Geometry' 
     } 
    } 
}, { 
    id: 2, 
    name: 'Pankaj', 
    subjects: { 
     id: 3, 
     name: 'Marathi', 
     chapters: { 
      id: 1, 
      name: 'Kavita', 
      topics: { 
       id: 1, 
       name: 'Topic 1' 
      } 
     } 
    } 
}, { 
    id: 2, 
    name: 'Pankaj', 
    subjects: { 
     id: 4, 
     name: 'Hindi', 
     chapters: { 
      id: 1, 
      name: 'Katha', 
      topics: { 
       id: 2, 
       name: 'Topic 2' 
      } 
     } 
    } 
}, { 
    id: 2, 
    name: 'Pankaj', 
    subjects: { 
     id: 4, 
     name: 'Hindi', 
     chapters: { 
      id: 1, 
      name: 'Katha', 
      topics: { 
       id: 3, 
       name: 'Topic 3' 
      } 
     } 
    } 
}]; 

Я пытался работать с pull-unwind, но я предполагаю, что есть некоторые проблемы с ним. Если у кого-то есть другие идеи, я открыт для их реализации.

ответ

0

Вы пробовали рекурсию?

var data = [{ 
 
    id: 1, 
 
    name: 'Harshal', 
 
    subjects: [{ 
 
     id: 1, 
 
     name: 'English', 
 
     chapters: [{ 
 
      id: 1, 
 
      name: 'Grammar' 
 
     }, { 
 
      id: 2, 
 
      name: 'Comprehension' 
 
     }] 
 
    }, { 
 
     id: 2, 
 
     name: 'Maths', 
 
     chapters: [{ 
 
      id: 1, 
 
      name: 'Algebra' 
 
     }, { 
 
      id: 2, 
 
      name: 'Geometry' 
 
     }] 
 
    }] 
 
}, { 
 
    id: 2, 
 
    name: 'Pankaj', 
 
    subjects: [{ 
 
     id: 3, 
 
     name: 'Marathi', 
 
     chapters: [{ 
 
      id: 1, 
 
      name: 'Kavita', 
 
      topics: [{ 
 
       id: 1, 
 
       name: 'Topic 1' 
 
      }] 
 
     }] 
 
    }, { 
 
     id: 4, 
 
     name: 'Hindi', 
 
     chapters: [{ 
 
      id: 1, 
 
      name: 'Katha', 
 
      topics: [{ 
 
       id: 2, 
 
       name: 'Topic 2' 
 
      }, { 
 
       id: 3, 
 
       name: 'Topic 3' 
 
      }] 
 
     }] 
 
    }] 
 
}]; 
 

 
function unravel(obj) 
 
{ 
 
    var out = []; 
 
    var added = false; 
 
    for(var i in obj) { 
 
\t if(obj[i] instanceof Array) { 
 
\t  for(var j in obj[i]) { 
 
\t \t var r = unravel(obj[i][j]); 
 
\t \t for(var k in r) { 
 
\t \t  var a = {}; 
 
\t \t  for(var key in obj) { // make copy of obj 
 
\t \t \t a[key] = obj[key]; 
 
\t \t  } 
 
\t \t  a[i] = r[k]; 
 
\t \t  added = true; 
 
\t \t  out.push(a); 
 
\t \t } 
 
\t  } 
 
\t } 
 
    } 
 
    if(!added) { 
 
\t out.push(obj); 
 
    } 
 
    return out; 
 
} 
 

 
var op = []; 
 
for(var i in data) 
 
    op = op.concat(unravel(data[i])); 
 
console.log(JSON.stringify(op, null, 4));

+0

Awesome, это то, что я искал. Я попробовал рекурсию, но как-то испортил свою логику. –

Смежные вопросы