Entonces, tengo un objeto que contiene propiedades que son un objeto y (que contiene otros objetos hasta que ya no es un objeto) o una matriz de cadenas de texto de inglés y francés:
let langs = { click : ["Click here", "Cliquez ici"], stat : ["Fonction status", "Status de la fonction"], no : ["Disabled", "Désactivé"], ping : { base : ["Pinging...", "Calcul du ping..."], result : ["Search complete, my latency is", "Recherche terminée, ma latence est de"] }, kick : { error : { msg: [ "I can't find this member, please check its writing or @!", "Je n'ai pas trouvé ce membre, veuillez vérifier son orthographe ou son @ !" ] } } }Y el resultado que espero es:
let langs = { click : "Click here", stat : "Fonction status", no : "Disabled", ping : { base : "Pinging...", result : "Search complete, my latency is" }, kick : { error : { msg : "I can't find this member, please check its writing or @!" } } }Mi pregunta: ¿Hay alguna manera de copiar dinámicamente ese objeto para que mi salida sea exactamente la misma pero con las matrices solo como una cadena que sea el primer o el segundo elemento? Sé cómo establecer la propiedad de un objeto en (por ejemplo) el primer elemento
let langs = { a : ["1","2"], b : ["3","4"] } Object.keys(langs).forEach(n =>{ langs[n] = langs[n][0] }) console.log(langs)Pero el objeto "langs" no solo puede ser una matriz, sino también un objeto que contiene matrices u objetos que contienen objetos de matrices, etc. Sería increíble tener una función para esto.
let langs = { a : ["1","2"], b : ["3","4"] }; langs = onlySelectIndexElement(langs,0) // Or 1 if I want the second element etc..Este es uno de esos casos en los que la biblioteca JSON incorporada hace que las cosas sean literales:
let result = JSON.parse(JSON.stringify(langs, (key, value) => value instanceof Array ? value[0] : value )); Y listo, hemos terminado. La razón por la que esto funciona es por el poco conocido segundo argumento de JSON.stringify , llamado función de reemplazo. Usamos eso para convertir cada matriz en "el primer elemento de esa matriz", y eso es todo lo que tenemos que hacer. JSON.stringify hace que el objeto recursivo real camine por nosotros.
Querrías una función recursiva para esto.
Mapa sobre las entradas. Si el valor es una matriz, devuelve el índice. De lo contrario, ejecute recursivamente el valor a través de la misma función.
const onlySelectIndexElement = (obj, index) => Object.fromEntries( Object.entries(obj).map(([ key, val ]) => [ key, Array.isArray(val) ? val[index] : onlySelectIndexElement(val, index) ]) ) const langs = {"click":["Click here","Clique ici"],"stat":["Fonction status","Status de la fonction"],"no":["Disabled","Désactivé"],"ping":{"base":["Pinging...","Calcul du ping..."],"result":["Search complete, my latency is","Recherche terminée, ma latence est de"]},"kick":{"error":{"msg":["I can't find this member, please check its writing or @!","Je n'est pas trouvé ce membre, veuillez vérifier son écriture ou son @ !"]}}} console.log("en", onlySelectIndexElement(langs, 0)) console.log("fr", onlySelectIndexElement(langs, 1)) .as-console-wrapper { max-height: 100% !important; }Utilice una función recursiva que devuelva el primer elemento de la matriz cuando el valor sea una matriz; de lo contrario, devuelve un nuevo objeto donde los valores de propiedad son llamadas recursivas a la función.
let langs = { click: ["Click here", "Clique ici"], stat: ["Fonction status", "Status de la fonction"], no: ["Disabled", "Désactivé"], ping: { base: ["Pinging...", "Calcul du ping..."], result: ["Search complete, my latency is", "Recherche terminée, ma latence est de"] }, kick: { error: { msg: [ "I can't find this member, please check its writing or @!", "Je n'est pas trouvé ce membre, veuillez vérifier son écriture ou son @ !" ] } } } function mycopy(obj) { if (Array.isArray(obj)) { return obj[0]; } return Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, mycopy(value)])); } console.log(mycopy(langs));