So let say we have a JSON object like so:
{
"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
}
}
}
And the user gives me a string, If the string is "blacksmith" or "merchant" I want to return all the stuff they sell but if it's only a specific weapon name like "Altar of skies" it'd return only that weapon's information.
For example:
User string: "merchant"
Returns:
"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
}
}
User string: "Altar of skies"
Returns:
{
"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')
)
Using Object.keys and Array.includes to match with top-level keys
Uisng Object.values() to extract values out of top level objects, flatMap to flat all objects inside top level objects, and find in the flattern objects
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 }
you can find elements with nested element by the below code.
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");
strong text