Entonces, digamos que tenemos un objeto JSON así:
{ "blacksmith": { "sword": { "name": "Altar of skies", "description": "A really powerful sword", "rarity": 5 }, "bow": { "name": "Hell's string", "description": "A really powerful bow", "rarity": 4 }, "spear": { "name": "Heart piercer", "description": "A really powerful spear", "rarity": 5 } }, "merchant": { "sword": { "name": "Wind's wand", "description": "A really powerful sword", "rarity": 5 }, "bow": { "name": "Heaven's string", "description": "A really powerful bow", "rarity": 4 }, "spear": { "name": "Digger", "description": "A really powerful spear", "rarity": 5 } } } Y el usuario me da una string , si la string es "herrero" o "comerciante", quiero devolver todas las cosas que venden, pero si es solo un nombre de arma específico como "Altar de los cielos", devolvería solo la información de esa arma. .
Por ejemplo:
Cadena de usuario: "comerciante"
Devoluciones:
"merchant": { "sword": { "name": "Wind's wand", "description": "A really powerful sword", "rarity": 5 }, "bow": { "name": "Heaven's string", "description": "A really powerful bow", "rarity": 4 }, "spear": { "name": "Digger", "description": "A really powerful spear", "rarity": 5 } }Cadena de usuario: "Altar de los cielos"
Devoluciones:
{ "name": "Altar of skies", "description": "A really powerful sword", "rarity": 5 } let d = { "blacksmith": { "sword": { "name": "Altar of skies", "description": "A really powerful sword", "rarity": 5 }, "bow": { "name": "Hell's string", "description": "A really powerful bow", "rarity": 4 }, "spear": { "name": "Heart piercer", "description": "A really powerful spear", "rarity": 5 } }, "merchant": { "sword": { "name": "Wind's wand", "description": "A really powerful sword", "rarity": 5 }, "bow": { "name": "Heaven's string", "description": "A really powerful bow", "rarity": 4 }, "spear": { "name": "Digger", "description": "A really powerful spear", "rarity": 5 } } } function getTarget(data, userString) { if (Object.keys(data).includes(userString)) { return data[userString] } return Object.keys(data) .reduce((acc, key) => [...acc, Object.values(data[key])], []) .reduce((acc, itms) => [...acc, ...itms], []) .filter(({name}) => name == userString) } console.log( getTarget(d, 'Altar of skies') ) console.log( getTarget(d, 'merchant') )Usar Object.keys y Array.includes para hacer coincidir con claves de nivel superior
Uisng Object.values() para extraer valores de los objetos de nivel superior, flatMap para aplanar todos los objetos dentro de los objetos de nivel superior y buscar en los objetos aplanados
const data = {"blacksmith":{"sword":{"name":"Altar of skies","description":"A really powerful sword","rarity":5},"bow":{"name":"Hell's string","description":"A really powerful bow","rarity":4},"spear":{"name":"Heart piercer","description":"A really powerful spear","rarity":5}},"merchant":{"sword":{"name":"Wind's wand","description":"A really powerful sword","rarity":5},"bow":{"name":"Heaven's string","description":"A really powerful bow","rarity":4},"spear":{"name":"Digger","description":"A really powerful spear","rarity":5}}}; function findWeapon(data, userInput){ if(Object.keys(data).includes(userInput)){ return data[userInput]; // res = { [userInput]: data[userInput] }; } return Object.values(data) .flatMap(o => Object.values(o)) .find(o => o.name===userInput); } console.log(findWeapon(data, "Altar of skies")); console.log(findWeapon(data, 'merchant')); .as-console-wrapper { max-height: 100% !important; top: 0 }puede encontrar elementos con elementos anidados mediante el siguiente código.
var obj={ "blacksmith": { "sword": { "name": "Altar of skies", "description": "A really powerful sword", "rarity": 5 }, "bow": { "name": "Hell's string", "description": "A really powerful bow", "rarity": 4 }, "spear": { "name": "Heart piercer", "description": "A really powerful spear", "rarity": 5 } }, "merchant": { "sword": { "name": "Wind's wand", "description": "A really powerful sword", "rarity": 5 }, "bow": { "name": "Heaven's string", "description": "A really powerful bow", "rarity": 4 }, "spear": { "name": "Digger", "description": "A really powerful spear", "rarity": 5 } } } function findObj(inp){ if(obj[inp]){ console.log(obj[inp]); } else{ var keys=Object.keys(obj); flag=0; for(var i=0;i<keys.length;i++){ if(flag==1){ break; } var innerObj=obj[keys[i]]; var innerKeys=Object.keys(innerObj); for(var j=0;j<innerKeys.length;j++){ if(innerKeys[j]==inp){ console.log(innerObj[innerKeys[j]]); break; } var ob=innerObj[innerKeys[j]]; if(ob.name==inp){ console.log(ob); flag=1; break; } } } } } findObj("blacksmith"); findObj("Altar of skies");texto fuerte