0votos

Crear la tabla de contenido de un libro en JavaScript

por josejuan hace 5 años

Exactamente la misma estrategia que en Haskell.

Alguien ha perdido los números de índice de cada contenido de un libro ¿serás capaz de reconstruirlo?.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// si javascript dispusiera de la función `groupBy`, sería simplemente 
function listToTree(A) { 
  return A.groupBy((a, b) => a.nivel < b.nivel). 
           map(a => ({ titulo: a[0].titulo, hijos: listToTree(a.slice(1)) })); 
 
 
 
 
 
 
 
// no la tiene, pero podemos hacerla nosotros 
Array.prototype.groupBy = function (f) { 
  if(this.length == 0) return []; 
  var g = [[this[0]]], i = 1; 
  for(;i < this.length; i++) 
    if(f(g[0][0], this[i])) g[0].push(this[i]); 
                        else g.unshift([this[i]]); 
  return g.reverse(); 
}; 
 
 
// entonces, partiendo de los datos del desafío 
apartados = [ { titulo: "Introducción", nivel: 1 } 
            , { titulo: "Motivación", nivel: 2 } 
            , { titulo: "Reseña histórica", nivel: 2 } 
            , { titulo: "Origen", nivel: 3 } 
            , { titulo: "Trabajos preliminares", nivel: 3 } 
            , { titulo: "Soluciones actuales", nivel: 2 } 
            , { titulo: "Objetivo de este libro", nivel: 2 } 
            , { titulo: "Requisitos", nivel: 1 } 
            , { titulo: "Hardware", nivel: 2 } 
            , { titulo: "Software", nivel: 2 } 
            ]; 
 
 
// generar los datos solicitados (ya pasados a JSON) es 
JSON.stringify(listToTree(apartados), null, 4); 
 
// quedando 
        "titulo": "Introducción", 
        "hijos": [ 
                "titulo": "Motivación", 
                "hijos": [] 
            }, 
                "titulo": "Reseña histórica", 
                "hijos": [ 
                        "titulo": "Origen", 
                        "hijos": [] 
                    }, 
                        "titulo": "Trabajos preliminares", 
                        "hijos": [] 
            }, 
                "titulo": "Soluciones actuales", 
                "hijos": [] 
            }, 
                "titulo": "Objetivo de este libro", 
                "hijos": [] 
    }, 
        "titulo": "Requisitos", 
        "hijos": [ 
                "titulo": "Hardware", 
                "hijos": [] 
            }, 
                "titulo": "Software", 
                "hijos": [] 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.