Tengo la sensación de que esto debería ser simple
Tengo algo de html como este (no tengo control sobre el html)
<div class="something" data-spec="['thing','another-thing','one-more-thing']">Stuff</div>Estoy tratando de leer la especificación de datos como una matriz sin tener que dividirla en una cadena, dividirla y luego insertar los valores en una matriz.
Si hago esto:
let elem = $('.something') let attr = elem[0].attributes['data-spec'] console.log(attr)Vuelve:
data-spec="['thing','another-thing','one-more-thing']"¿Hay alguna manera de leer la especificación de datos como un objeto de matriz?
Gracias.
De lo contrario, diría JSON.parse() , pero dado que son comillas simples, no puede hacerlo directamente.
La opción horrible es eval() , pero creo que un término medio feliz (que podría romperse si hay otras comillas en la cadena) es
const attrString = elem[0].attributes['data-spec']; // replace single quotes with double quotes for JSON parsing const attr = JSON.parse(attrString.replace(/'/g, '"'));Intente reemplazar todas las comillas simples con comillas dobles y luego use JSON.parse
const dataSpec="['thing','another-thing','one-more-thing']" JSON.parse(dataSpec.replace(/'/g, '"')) const dataSpec = "['thing','another-thing','one-more-thing']" const array = JSON.parse(dataSpec.replace(/'/g, '"')) console.log(array);No estoy seguro si puede hacer directamente lo que quiere, pero como solución puede usar una expresión regular para extraer todo entre comillas, ejemplo:
var test = "data-spec=\"['thing','another-thing','one-more-thing']\""; var result = test.match(/(?<=\').*(?=\')/); console.log(result); //will log : Array [ "thing','another-thing','one-more-thing" ]Nota: tal vez deba usar JSON.stringify(elem[0].attributes['data-spec']) para tener la misma cadena de "prueba" que tengo en mi ejemplo