Name Surname
Name Surname

Reputation: 1

Tell me how to filter the array

Need to get an array of houses that match these parameters

const houses = [
    {id: 1, name: 'house1', floors: 2, balconies: 1, terrace: 'Y', veranda: 'N'},
    {id: 2, name: 'house2', floors: 1, balconies: "N", terrace: 'N', veranda: 'Y'},
    {id: 3, name: 'house3', floors: 3, balconies: 1, terrace: 'Y', veranda: 'N'},
    {id: 4, name: 'house4', floors: 1, balconies: "N", terrace: 'N', veranda: 'Y'},
    {id: 5, name: 'house5', floors: 1, balconies: "N", terrace: 'Y', veranda: 'N'},
    {id: 6, name: 'house6', floors: 3, balconies: 2, terrace: 'N', veranda: 'N'},
    {id: 7, name: 'house7', floors: 1, balconies: "N", terrace: 'Y', veranda: 'Y'},
    {id: 8, name: 'house8', floors: 2, balconies: 1, terrace: 'N', veranda: 'Y'},
]

const parameters = {floors: 1, terrace: 'Y', veranda: 'Y'}

const filterArray = houses.filter(house => {
    // Code
    
})

I tried it like this Object.entries(parameters).some(e => e == house[e])

I'm already confused. I tried using includes. Also nothing

I apologize for my English

Upvotes: 0

Views: 88

Answers (4)

Mamunur Rashid
Mamunur Rashid

Reputation: 1185

const houses = [
  {id: 1, name: 'house1', floors: 2, balconies: 1, terrace: 'Y', veranda: 'N'},
  {id: 2, name: 'house2', floors: 1, balconies: "N", terrace: 'N', veranda: 'Y'},
  {id: 3, name: 'house3', floors: 3, balconies: 1, terrace: 'Y', veranda: 'N'},
  {id: 4, name: 'house4', floors: 1, balconies: "N", terrace: 'N', veranda: 'Y'},
  {id: 5, name: 'house5', floors: 1, balconies: "N", terrace: 'Y', veranda: 'N'},
  {id: 6, name: 'house6', floors: 3, balconies: 2, terrace: 'N', veranda: 'N'},
  {id: 7, name: 'house7', floors: 1, balconies: "N", terrace: 'Y', veranda: 'Y'},
  {id: 8, name: 'house8', floors: 2, balconies: 1, terrace: 'N', veranda: 'Y'},
]

const parameters = {floors: 1, terrace: 'Y', veranda: 'Y'};

const filtered = houses.filter((house) => {
  return house.floors === parameters.floors && house.terrace === parameters.terrace && house.veranda === parameters.veranda;
});

console.log(filtered);

Upvotes: -1

Sajeeb Ahamed
Sajeeb Ahamed

Reputation: 6390

You can use a for...in loop inside a filter() and filter the array. Try this-

const houses = [
    {id: 1, name: 'house1', floors: 2, balconies: 1, terrace: 'Y', veranda: 'N'},
    {id: 2, name: 'house2', floors: 1, balconies: "N", terrace: 'N', veranda: 'Y'},
    {id: 3, name: 'house3', floors: 3, balconies: 1, terrace: 'Y', veranda: 'N'},
    {id: 4, name: 'house4', floors: 1, balconies: "N", terrace: 'N', veranda: 'Y'},
    {id: 5, name: 'house5', floors: 1, balconies: "N", terrace: 'Y', veranda: 'N'},
    {id: 6, name: 'house6', floors: 3, balconies: 2, terrace: 'N', veranda: 'N'},
    {id: 7, name: 'house7', floors: 1, balconies: "N", terrace: 'Y', veranda: 'Y'},
    {id: 8, name: 'house8', floors: 2, balconies: 1, terrace: 'N', veranda: 'Y'},
]

const parameters = {floors: 1, terrace: 'Y', veranda: 'Y'};

const filtered = houses.filter(house => {
  let retrunValue = true;

  for (const key in parameters) {
    retrunValue &&= house[key] === parameters[key];
  }
  
  return retrunValue;
});

console.log(filtered);
.as-console-wrapper{min-height: 100%!important; top: 0}

Upvotes: 0

Heiko Theißen
Heiko Theißen

Reputation: 16676

But if some parameters require extra rules, for example, the specified number of floors may be exceeded, you may want to code the rules explicitly:

const filterArray = houses.filter (house => {
  if (house.floors < parameters.floors) return false; // too few floors
  if (parameters.terrace === "Y" && house.terrace === "N") return false; // missing terrace
  if (parameters.veranda === "Y" && house.veranda === "N") return false; // missing veranda
  // Something analogous for parameters.balconies
  return true; // Everything is OK
})

Upvotes: -1

charlietfl
charlietfl

Reputation: 171679

One fairly easy way is use Object.entries() to turn your parameters object into an array so you can use paramsArray.every() in your filter().

This doesn't require you to know any of the specific properties in the parameters object or even how many there are, the only criteria is that they all have a matching value in the filtered objects

const houses = [
    {id: 1, name: 'house1', floors: 2, balconies: 1, terrace: 'Y', veranda: 'N'},
    {id: 2, name: 'house2', floors: 1, balconies: "N", terrace: 'N', veranda: 'Y'},
    {id: 3, name: 'house3', floors: 3, balconies: 1, terrace: 'Y', veranda: 'N'},
    {id: 4, name: 'house4', floors: 1, balconies: "N", terrace: 'N', veranda: 'Y'},
    {id: 5, name: 'house5', floors: 1, balconies: "N", terrace: 'Y', veranda: 'N'},
    {id: 6, name: 'house6', floors: 3, balconies: 2, terrace: 'N', veranda: 'N'},
    {id: 7, name: 'house7', floors: 1, balconies: "N", terrace: 'Y', veranda: 'Y'},
    {id: 8, name: 'house8', floors: 2, balconies: 1, terrace: 'N', veranda: 'Y'},
]

const parameters = {floors: 1, terrace: 'Y', veranda: 'Y'};

const paramsArray = Object.entries(parameters)

const filterArray = houses.filter(house => paramsArray.every(([k,v])=> house[k] === v));

console.log(filterArray)

Upvotes: 5

Related Questions