He estado buscando y en la mayoría de los foros la respuesta a esta pregunta es más o menos que no es necesario convertir una variable en una cadena. Sin embargo, dado el siguiente escenario, ¿cómo podría resolver el problema?
Tengo una categories de objeto de la siguiente manera:
const categories = { 1: ctgOne, 2: ctgTwo, 3: ctgThree, 4: ctgFour, };Estas categorías corresponden a objetos que contienen algunos datos arbitrarios:
const ctgOne = { test1: ["blah", "blah", "blah"], test2: ["blah", "blah", "blah"], }; const ctgTwo = { test1: ["blah", "blah", "blah"], test2: ["blah", "blah", "blah"], test3: ["blah", "blah", "blah"], }; const ctgThree = { test1: ["blah", "blah", "blah"], test3: ["blah", "blah", "blah"], }; const ctgFour = { test2: ["blah", "blah", "blah"], test3: ["blah", "blah", "blah"], }; Tengo otra lista de categoryList de objetos que contiene algunos números asociados a cada categoría en matrices:
const categoryList = { ctgOne: [1, 3, 5, 8, 13], ctgTwo: [23, 4, 78], ctgThree: [12, 33, 54, 8, 13, 12, 45], ctgFour: [1, 35, 5, 2], }; Cuando ejecuto el siguiente script, aparece un error para el segundo console.log(count); por razones obvias porque in count = categoryList[categoryName].length; Se requiere que "categoryName" sea una cadena. Sin embargo, si convierto las categorías en mi objeto de categories en cadenas, console.log(keys); me da la longitud de la cadena en lugar del número de claves en el objeto.
let categoryNumber = 1; let categoryName = categories[categoryNumber]; let keys = Object.keys(categoryName).length; console.log(keys); count = categoryList[categoryName].length; console.log(count); ¿Cuál sería el mejor enfoque para resolver este dilema? Quiero contar la cantidad de claves en el objeto, así como los números en la lista de categoryList .
No obtiene nombres de variables como cadenas. En el mejor de los casos, podrá hacerlo al revés, pero en realidad nunca debería preocuparse por los nombres de las variables como datos. Puede (y debe) alinear esas 4 variables const en su objeto de categories .
Para obtener el valor respectivo del otro objeto, use las mismas claves tanto en las categories como en la lista de categoryList . Es decir, ya sea
const categories = { ctgOne: { test1: …, test2: …}, ctgTwo: { test1: …, test2: …, test3: …}, ctgThree: { test1: …, test3: …}, ctgFour: { test2: …, test3: …}, }; const categoryList = { ctgOne: [1, 3, 5, 8, 13], ctgTwo: [23, 4, 78], ctgThree: [12, 33, 54, 8, 13, 12, 45], ctgFour: [1, 35, 5, 2], };o
const categories = { 1: { test1: …, test2: …}, 2: { test1: …, test2: …, test3: …}, 3: { test1: …, test3: …}, 4: { test2: …, test3: …}, }; const categoryList = { 1: [1, 3, 5, 8, 13], 2: [23, 4, 78], 3: [12, 33, 54, 8, 13, 12, 45], 4: [1, 35, 5, 2], };pero no una mezcla de ellos. Si realmente los necesita a ambos, no se saldrá con la suya sin una tabla de mapeo separada.
En su objeto, ¿por qué no almacena el nombre del objeto, que es una cadena?
En su lista de categorías, use el nombre, en lugar de los objetos, como claves.
Por ejemplo,
const ctgOne = { name: "Category 1", test1: ..., test2: ... } const ctgTwo = { name: "Category 2", test1: ..., test2: ... } const categoryList = { "Category 1": [1, 3, 5, 8, 13], "Category 2": [23, 4, 78], }Entonces puedes hacer
let categoryNumber = 1; let category = categories[category]; let categoryName = category.name; let keys = Object.keys(category).length; console.log(keys); count = categoryList[categoryName].length; console.log(count);