Todavía soy bastante nuevo en JavaScript y necesito ayuda con una tarea que estoy tratando de realizar.
Tengo una serie de objetos como este:
const data = { "Total_packages": { "package1": { "tags": [ "kj21", "j1", "sj2", "z1" ], "expectedResponse": [ { "firstName": "Name", "lastName": "lastName", "purchase": [ { "title": "title", "category": [ "a", "b", "c" ] } ] } ] }, "package2": { "tags": [ "s2", "dsd3", "mhg", "sz7" ], "expectedResponse": [ { "firstName": "Name1", "lastName": "lastName1", "purchase": [ { "title": "title1", "category": [ "a1", "b1", "c1" ] } ] } ] } } }Mi objetivo es enviar solicitudes de API con un valor aleatorio de "etiquetas" desde arriba y luego hacer coincidir la respuesta que recibo de la llamada con la parte de respuesta esperada de los datos.
Mi pensamiento inicial fue hacer algo como:
data.Total_packages.tags[Math.floor(Math.random() * data.Total_packages.tags.length)];Sin embargo, no puedo llamar a "etiquetas" sin atravesar su padre, es decir, "paquete1" o "paquete2", por lo que ya no será aleatorio.
Sé que probablemente haya una manera muy simple de hacerlo que no estoy entendiendo. Cualquier consejo sería apreciado.
Puede crear una matriz a partir de varios elementos de etiquetas y usarla para hacer cosas aleatorias.
const data = { "Total_packages": { "package1": { "tags": [ "kj21", "j1", "sj2", "z1" ], "expectedResponse": [ { "firstName": "Name", "lastName": "lastName", "purchase": [ { "title": "title", "category": [ "a", "b", "c" ] } ] } ] }, "package2": { "tags": [ "s2", "dsd3", "mhg", "sz7" ], "expectedResponse": [ { "firstName": "Name1", "lastName": "lastName1", "purchase": [ { "title": "title1", "category": [ "a1", "b1", "c1" ] } ] } ] } } } const arrayOfTags = Object.entries(data.Total_packages).reduce((acc, [k, v]) => { if (v.tags) acc = acc.concat(v.tags); return acc; }, []); console.log(arrayOfTags); console.log(arrayOfTags[Math.floor(Math.random() * arrayOfTags.length)]);Deberá extraer las etiquetas, juntarlas en una matriz y aleatorizar el índice, finalmente obtener el valor allí. La solución a continuación asume que sus etiquetas son todas matrices dentro data.Total_packages[whateverpackage]
const data = { "Total_packages": { "package1": { "tags": [ "kj21", "j1", "sj2", "z1" ], "expectedResponse": [ { "firstName": "Name", "lastName": "lastName", "purchase": [ { "title": "title", "category": [ "a", "b", "c" ] } ] } ] }, "package2": { "tags": [ "s2", "dsd3", "mhg", "sz7" ], "expectedResponse": [ { "firstName": "Name1", "lastName": "lastName1", "purchase": [ { "title": "title1", "category": [ "a1", "b1", "c1" ] } ] } ] } } } let tags = []; for (let key in data.Total_packages) { if (data.Total_packages[key].tags) tags = tags.concat(data.Total_packages[key].tags); } console.log(tags[parseInt(tags.length * Math.random())]);guardé todas las etiquetas en una matriz separada y mantuve la referencia de la respuesta expectedResponse en el bloque. entonces es cuestión de seleccionar aleatoriamente un índice de etiqueta y hacer coincidir con el índice de respuesta esperada del bloque. probablemente necesite algún ajuste en la longitud aleatoria, pero espero que lo lleve en la dirección correcta.
var tags = [] var block = Object.values(data.Total_packages).flat() block.forEach(item => tags = [...tags, ...item.tags]) var index = tags[parseInt(tags.length * Math.random())] console.log(block[Math.floor(tags.indexOf(index) / 4)].expectedResponse)