["10","13"] es la matriz, necesita encontrar los valores entre ellos y aplanar la matriz con los valores -> ["10","11","12","13"].
La primera matriz anterior (["10", "13"]) está en una lista de matrices.
const OriginalData = { Red:{ Name:"L", List:[ ["1", "5"], ["2", "5"], ["7", "9" ], ] }, Blue:{ Name:"BL", List:[ ["1", "5"], ["7", "9" ], ["10", "13" ], ["15", "20"] ] }, Black:{ List:[ ["Random"], "Random2" ] } }Entonces, finalmente, el objeto debe verse como,
{ Level:{ Name:"L", List:[ 1, 2, 3, 4, 5, 7, 8, 9 ] }, Basement:{ Name:"BL", List:[ 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20 ] }, Custom:{ List:[ "Random", "Random2" ] } }Qué debería hacer: Tome el primer objeto, dentro de la Lista hay un conjunto de rangos, los valores entre esos rangos deben encontrarse y aplanarse sin duplicados. Encontrar los valores entre es solo para "Rojo" y "Azul". En la tecla "Negro" solo se necesita aplanar.
Lo intenté,
Código:
const submitData = () => { let obj = originalData; let flattenedArray = [].concat.apply([], originalData.Red.List); let uniqueArray = flattenedArray.filter( (v, i, a) => a.indexOf(v) === i ); obj = { ...originalData, Red: { ...originalData.Red, List: uniqueArray, }, }; console.log(obj); };El código anterior aplana la matriz pero no encontrará entre los números y solo funcionó para la tecla "Roja"
Un ejemplo simple para crear un rango:
let example = ["10","13"]; let min = Math.min(...example); let max = Math.max(...example); let result = []; for (i = min; i <= max; i++) { result.push(i); } console.log(min, max, result)Puede lograrlo fácilmente con una lógica simple y también funcionará para números aleatorios.
Pruebe esto (se agregaron comentarios descriptivos de la implementación en el siguiente fragmento de código) :
const OriginalData = { Red:{ Name:"L", List:[ ["1", "5"], ["2", "5"], ["7", "9" ], ] }, Blue:{ Name:"BL", List:[ ["1", "5"], ["7", "9" ], ["10", "13" ], ["15", "20"] ] } }; Object.keys(OriginalData).forEach(key => { // Flatten the original array list. OriginalData[key].List = OriginalData[key].List.flat() // Find min and max numbers from the array. const min = Math.min(...OriginalData[key].List); const max = Math.max(...OriginalData[key].List); // empty existing list array. OriginalData[key].List = []; // Now using for loop assign the values to the list array based on min and max value. for (let i = min; i <= max; i++) { OriginalData[key].List.push(i); } }); // Result console.log(OriginalData);Para crear una matriz de todos los números en un rango dado, puede crear una nueva matriz con el tamaño requerido y luego asignar cada una de sus entradas al índice de la entrada más el límite inferior dado.
function fillRange(r) { let b = +r[1] let a = +r[0] if (a > b) { let tmp = a a = b b = tmp } return Array(b - a + 1).fill(0).map((e, i) => a + i) }Esta función aplana una matriz y elimina todas las entradas duplicadas.
function union(arrays) { let flattened = [].concat.apply([], arrays) return flattened.reduce( (total, e) => { let i = total.indexOf(e) if (i === -1) { total.push(e) } return total }, []) }Entonces este código produce el resultado deseado de una lista de rangos:
function unionRanges(ranges) { let expanded = ranges.map((e) => fillRange(e)) return union(expanded).sort((a,b) => (ab)) }El objeto final se puede crear así:
function processData(data) { let res = {} res.Level = {} res.Basement = {} res.Custom = {} res.Level.Name = data.Red.Name; res.Level.List = unionRanges(data.Red.List) res.Basement.Name = data.Blue.Name res.Basement.List = unionRanges(data.Blue.List) res.Custom.List = union(data.Black.List) return res }