Reputation: 42
I'm trying to use JavaScript's filter() method to return an array of objects where the objects have a certain value. In my scenario, a user can have a first name, last name, and multiple characters attached to them.
I'm trying to use filter() to return any objects that have characters with at least 100 or more gold but it returns with an empty array. Here's what I wrote:
var users = [{
firstname: 'Owen',
lastname: 'Wilson',
characters: [{
race: 'dwarf',
level: 80,
gold: 150
},
{
race: 'dark elf',
level: 75,
gold: 50
},
{
race: 'human',
level: 70,
gold: 75
}
]
},
{
firstname: 'Vince',
lastname: 'Vaughan',
characters: [{
race: 'dwarf',
level: 80,
gold: 90
},
{
race: 'dark elf',
level: 75,
gold: 50
},
{
race: 'human',
level: 70,
gold: 75
}
]
},
{
firstname: 'Ben',
lastname: 'Stiller',
characters: [{
race: 'dwarf',
level: 80,
gold: 200
},
{
race: 'dark elf',
level: 75,
gold: 50
},
{
race: 'human',
level: 70,
gold: 75
}
]
}
];
var minimumGold = element => element.characters.gold >= 100;
var usersWithLotsOfGold = users.filter(minimumGold);
console.log(usersWithLotsOfGold);
// Expected objects [0] and [2]
Upvotes: 1
Views: 78
Reputation: 36564
element.characters
and it doesnot have a property gold
. If you want to check every element you can use some()
on elements.characters
.
var users = [{
firstname: 'Owen',
lastname: 'Wilson',
characters: [{
race: 'dwarf',
level: 80,
gold: 150
},
{
race: 'dark elf',
level: 75,
gold: 50
},
{
race: 'human',
level: 70,
gold: 75
}
]
},
{
firstname: 'Vince',
lastname: 'Vaughan',
characters: [{
race: 'dwarf',
level: 80,
gold: 90
},
{
race: 'dark elf',
level: 75,
gold: 50
},
{
race: 'human',
level: 70,
gold: 75
}
]
},
{
firstname: 'Ben',
lastname: 'Stiller',
characters: [{
race: 'dwarf',
level: 80,
gold: 200
},
{
race: 'dark elf',
level: 75,
gold: 50
},
{
race: 'human',
level: 70,
gold: 75
}
]
}
];
var minimumGold = element => element.characters.some(x => x.gold >= 100 );
var usersWithLotsOfGold = users.filter(minimumGold);
console.log(usersWithLotsOfGold)
Upvotes: 0
Reputation: 51816
You need to check each character in the characters
array. One approach is to use Array.prototype.some()
like this:
const users = [{firstname:'Owen',lastname:'Wilson',characters:[{race:'dwarf',level:80,gold:150},{race:'dark elf',level:75,gold:50},{race:'human',level:70,gold:75}]},{firstname:'Vince',lastname:'Vaughan',characters:[{race:'dwarf',level:80,gold:90},{race:'dark elf',level:75,gold:50},{race:'human',level:70,gold:75}]},{firstname:'Ben',lastname:'Stiller',characters:[{race:'dwarf',level:80,gold:200},{race:'dark elf',level:75,gold:50},{race:'human',level:70,gold:75}]}];
const minimumGold = element => element.characters.some(
character => character.gold >= 100
);
const usersWithLotsOfGold = users.filter(minimumGold);
console.log(usersWithLotsOfGold);
Upvotes: 1
Reputation: 1786
Well, element.characters
is an array, so it doesn't have a property name gold, so element.characters.gold >= 100
will always return false.
Instead, you should run another array method on the element.characters
property. And since I'm assuming you want users that have at least one character with 100 gold, we are going to use the [].some
method.
var users = [{
firstname: 'Owen',
lastname: 'Wilson',
characters: [{
race: 'dwarf',
level: 80,
gold: 150
},
{
race: 'dark elf',
level: 75,
gold: 50
},
{
race: 'human',
level: 70,
gold: 75
}
]
},
{
firstname: 'Vince',
lastname: 'Vaughan',
characters: [{
race: 'dwarf',
level: 80,
gold: 90
},
{
race: 'dark elf',
level: 75,
gold: 50
},
{
race: 'human',
level: 70,
gold: 75
}
]
},
{
firstname: 'Ben',
lastname: 'Stiller',
characters: [{
race: 'dwarf',
level: 80,
gold: 200
},
{
race: 'dark elf',
level: 75,
gold: 50
},
{
race: 'human',
level: 70,
gold: 75
}
]
}
];
var usersWithLotsOfGold = users.filter((user) => user.characters.some((character) => character.gold >= 100));
console.log(usersWithLotsOfGold);
// Expected objects [0] and [2]
Upvotes: 0