Anna F
Anna F

Reputation: 1683

Filter an array of nested objects

I have an array of nested objects and I have a user, which searches for a room Here is an array of objects.

enter image description here

I would like to filter an array as soon as user types something

I tried a lot of functions, but nothing worked for me, here is the last example, which failed

search(val: any) {
// if input is clear - show everything, what we have

    if (val === '') {
      this.roomList = this.roomList;
    } else {
//choose the object (objects) where rName = val

      this.roomList = this.roomList.staticData.rName.filter(function(o) {
        return Object.keys(o).some(function(k) {
          return o[k].toString().toLowerCase().indexOf(val) != -1;
        })
      });
    }
  } 

Could you please help or give me a hint?

Upvotes: 0

Views: 148

Answers (2)

Satpal
Satpal

Reputation: 133453

You need to apply Array.filter() on roomList instead of staticData propety

this.roomList = this.roomList.filter(function (r) {
    return r.staticData.rName.toLowerCase().indexOf(val.toLowerCase()) != -1
});

Upvotes: 3

Jeremy Thille
Jeremy Thille

Reputation: 26400

this.roomList = this.roomList.staticData.rName

This is a wrong starting point, just look at it. Then, rName is not an array, so you can't invoke .filter on it.

Here's how to do it :

this.roomListFiltered = this.roomList.filter(o => new RegExp(val,"i").test(o.staticData.rName) )

new RegExp(val,"i") performs a case-insensitive match.

Also, store the result of the filter in a different variable, otherwise you will lose your original list as it gets filtered out.

Upvotes: 1

Related Questions