Dados los siguientes valores:
const values = ['name1|engine1|color1', 'name2|engine2|color2', 'name3|engine3|color3']Me gustaría crear una matriz para los valores de la misma posición, así:
cars = { names: ['name1', 'name2', 'name3'], engines: ['engine1', 'engine2', 'engine3'], colors: ['color1', 'color2', 'color3'], ...other properties }Traté de hacerlo de esta manera:
values.reduce((acc, value) => { const [name, engine, color] = value.split('|') acc.names.push(name) acc.engines.push(engine) acc.colors.push(color) return acc }, {})El problema es que acc.name, acc.engine y acc.color aún no existen, y da un error al presionar. ¿Cuál sería una forma de hacer esto limpiamente, teniendo en cuenta que tendrán otras propiedades?
const values = [ "name1|engine1|color1", "name2|engine2|color2", "name3|engine3|color3" ]; const cars = { names: [], engines: [], colors: [] }; const result = values.reduce((acc, value) => { const [name, engine, color] = value.split("|"); acc.names.push(name); acc.engines.push(engine); acc.colors.push(color); return acc; }, cars); console.log(result); const values = [ "name1|engine1|color1", "name2|engine2|color2", "name3|engine3|color3" ]; const result = values.reduce((acc, value) => { const [name, engine, color] = value.split("|"); (acc.names ??= []).push(name); (acc.engines ??= []).push(engine); (acc.colors ??= []).push(color); return acc; }, {}); console.log(result);Si tiene nombres de propiedad muy largos, también puede hacer esto:
const values = [ "name1|engine1|color1", "name2|engine2|color2", "name3|engine3|color3" ]; const keys = ["names", "engines", "colors", ...]; const results = values.reduce((acc, value) => { const segments = value.split("|"); keys.forEach((key, index) => { (acc[key] ??= []).push(segments[index]); }); return acc; }, {}); console.log(results)Object.fromEntries hace que esto sea fácil de hacer en una simple llamada de map :
const reconstruct = (names, values) => values .map (v => Object .fromEntries (v .split ('|') .map ((v, i) => ([names[i], v])))) console .log (reconstruct ( ['name', 'engine', 'color'], [ 'name1|engine1|color1', 'name2|engine2|color2', 'name3|engine3|color3' ])) .as-console-wrapper {max-height: 100% !important; top: 0} Convertimos cada una de nuestras cadenas en algo como [['name', 'name1'], ['engine', 'engine1'], ['color', 'color1']] luego llamamos a Object.fromEntries en eso.