vin_tay
vin_tay

Reputation: 42

The .filter() method is return an empty array

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

Answers (3)

Maheer Ali
Maheer Ali

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

Patrick Roberts
Patrick Roberts

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

dotconnor
dotconnor

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

Related Questions