tengo una cuerda
var str = "1:6,5,2,2:3"; Quiero convertir este str en un diccionario js tal que:
var dict = {1:"6,5,2", 2:"3"};para que pueda obtener los valores por su respectivo índice clave. ¿Cómo lo convierto?
Probé este código para almacenar los valores divididos en una matriz:
var pages = "1:6,5,2,2:3"; var numbers = []; if (pages.includes(',')) { page_nos = pages.split(','); for (var i = 0; i < page_nos.length; i++) { if (page_nos[i].includes(':')) { var n = page_nos[i].split(':'); numbers.push(n[1]); } else { numbers.push(page_nos[i]); } } } else { page_nos = pages.split(':'); numbers.push(page_nos[1]) }; console.log('numbers: ', numbers); Pero es incorrecto, ya que sin dictionary es imposible saber qué valor pertenece a qué índice
Si no puede hacer que su cadena de entrada sea un JSON adecuado u otro formato fácilmente analizable en primer lugar, esto responde a su pregunta:
const str = "1:6,5,2,2:3"; const obj = str.split(/,(?=\d+:)/).reduce((accu, part) => { const [k, v] = part.split(':', 2); accu[k] = v; return accu; }, {}); console.log(obj);Corte la cadena en todas las comas seguidas de dígitos y dos puntos. Cada parte tiene una clave delante de dos puntos y un valor después, que debe incluirse en un objeto en este formato.
Sin solución de mutaciones.
const str = "1:6,5,2,2:3"; const dict = str .split(/(\d+:.*)(?=\d+:)/g) .reduce((t, c) => { const [key, value] = c.replace(/,$/, "").split(/:/); return { ...t, [key]: value } }); console.log(dict);si considera no usar expresiones regulares, también puede probar esto. para sacar un dictado (Objeto) de esa cadena, esto servirá.
var pages = "1:6,5,2,2:3"; function stringToObject(str) { var page_object = {}; var last_object; str.split(",").forEach((item) => { if (item.includes(":")) { page_object[item.split(":")[0]] = item.split(":")[1]; last_object = item.split(":")[0]; } else { page_object[last_object] += `,${item}`; } }); return page_object; } console.log(stringToObject(pages))