Tengo un bot de discordia y guarda los logros en un archivo JSON. La estructura JSON es así:
{ "784095768305729566": { "coins": 14598, "achievements": { "taking_inventory": true } }, }El comando debería darle una visión general de los logros que ya tiene.
Quiero crear una incrustación y ejecutar un bucle for para cada elemento secundario de los logros. Si el valor es true , el ciclo for debe tomar el nombre del valor y el valor y agregar un campo a la inserción donde el título del campo es el nombre del valor.
Ahí tengo varios problemas.
Object.keys(...) pero eso da todas las claves y no una por una. No se como sacar los valores.achievements .Lo intenté:
for(var i = 0; i<datafile[id].achievements.length; i++){...}pero eso no funcionó.
Puede obtener una matriz de las entradas de un objeto (claves y valores) de Object.entries. Puede filtrar esa matriz para que el valor sea verdadero. Puede asignar el resultado a la clave. Esto le da una serie de claves de logros que tenían el valor "verdadero".
const datafile = { "784095768305729566": { "coins": 14598, "achievements": { "taking_inventory": true, "other_achievement": false } }, }; const id = "784095768305729566"; const achievements = Object.entries(datafile[id].achievements) .filter(([k, v]) => v) .map(([k, v]) => k); // do something with achievements console.log(achievements);Puede usar Object.entries que devuelve una matriz de los pares [key, value] de propiedades enumerables con clave de cadena enumerables de un objeto determinado:
let user = "784095768305729566" let obj = { "784095768305729566": { "coins": 14598, "achievements": { "taking_inventory": true, "another_achievement": true, "yet_another_achievement": false, "and_one_more": true, } }, } let fields = Object.entries(obj[user].achievements) .map(([name, value]) => ({ name, value: value ? '✅' : '❌', inline: false, })) console.log(fields) // or if you only want to include achievements a user already has let onlyTruthyFields = Object.entries(obj[user].achievements) // only where value is truthy .filter(([name, value]) => value) .map(([name, value]) => ({ name, value: '✅', inline: false, })) console.log(onlyTruthyFields)Y luego simplemente agregue estos a su inserción:
embed.addFields(fields)