Estoy tratando de crear una lista de todos los niveles únicos en una matriz multidimensional de objetos.
Asumiendo estos datos...
let levels = [ ["P", "B", "L"], ["A", "B", "L3"], ["A", "B", "L3"], ["P", "B", "M"], ["P", "C", "L"], ["A", "C", "L3"] ];Necesito terminar con una estructura de matriz como esta:
const result = [ [ 1, 'P', 11, 'P.B', 111, 'PBL' ], [ 1, 'P', 11, 'P.B', 112, 'PBM' ], [ 1, 'P', 12, 'P.C', 121, 'PCL' ], [ 2, 'A', 21, 'A.B', 211, 'ABL3' ], [ 2, 'A', 22, 'A.C', 221, 'ACL3' ] ];Nota:
Where each entry is an array of a unique level. Level ids: 1 => level 1 11 => level 1 and its sub level 111 => level 1, its sub level and sub level's level On each new level 1 the id will increment as follows for other sub-levels and sub level's level: 2 => new level 1 21 => new level 1 and its new sub-level 211 => new level 1, its new sub-level and new sub level's levelTengo verdaderos problemas para calcular los identificadores de nivel para cada par único. Hasta ahora, he intentado devolver los pares únicos solo como se muestra a continuación:
function updateLevels(levels) { const { result } = levels.reduce( (acc, crr) => { const l1Key = crr[0]; const l2Key = `${l1Key}.${crr[1]}`; const l3Key = `${l2Key}.${crr[2]}`; if (!acc.checkMap[l3Key]) { acc.checkMap[l3Key] = true; acc.result.push([l1Key, l2Key, l3Key]); } return acc; }, { checkMap: {}, result: [], } ); return result; } const result = [ [ 'P', 'P.B', 'PBL' ], [ 'A', 'A.B', 'ABL3' ], [ 'P', 'P.B', 'PBM' ], [ 'P', 'P.C', 'PCL' ], [ 'A', 'A.C', 'ACL3' ] ]Básicamente, esta solución necesita dos pasos:
Obtenga una matriz con números y cadenas conectadas.
Puede tomar un objeto para mantener la información de nivel y verificar si el conjunto de datos real existe con un indicador add para enviar una nueva matriz al conjunto de resultados.
Ordene el resultado tomando índices impares de la matriz.
const getUnique = array => { const levels = { _: 0, data: [] }; return array .reduce((r, a) => { let add = false; const temp = [], final = a.reduce((l, v, i, a) => { if (!l[v]) { l[v] = { _: 0, data: [(l.data[0] || 0) * 10 + ++l._, (l.data[1] || '' ) + (l.data[1] ? '.' : '') + v] }; add = true; } temp.push(...l[v].data); return l[v]; }, levels); if (add) r.push(temp); return r; }, []) .sort((a, b) => { let i = 0, r = 0; while (i < a.length && !r) { r = a[i] - b[i]; i += 2; } return r; }); }, levels = [["P", "B", "L"], ["A", "B", "L3"], ["A", "B", "L3"], ["P", "B", "M"], ["P", "C", "L"], ["A", "C", "L3"]], result = getUnique(levels); result.forEach(a => console.log(...a));