最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

javascript - Filtering nested objects in ng-repeat with a search input field - Stack Overflow

matteradmin10PV0评论

I am trying to filter nested objects in ng-repeat by using a search textbox.

Given the following object:

$scope.items = {
    "1": {
        name: "First Item",
        tag: "first"
    },
    "2": {
        name: "Second Item",
        tag: "second"
    }
};

I want to do something like this:

<input type="text" name="serchBox" ng-model="searchByName">
<p ng-repeat="(key, values) in items | filter:{name: searchByName}">
    Using both {{key}} and {{values.name}}
</p>

This is indeed not working. I tried a lot of things and I couldn't make it work properly. I don't want to change my object. I was searching a lot but I didn't find anything that fits my needings.

I am trying to filter nested objects in ng-repeat by using a search textbox.

Given the following object:

$scope.items = {
    "1": {
        name: "First Item",
        tag: "first"
    },
    "2": {
        name: "Second Item",
        tag: "second"
    }
};

I want to do something like this:

<input type="text" name="serchBox" ng-model="searchByName">
<p ng-repeat="(key, values) in items | filter:{name: searchByName}">
    Using both {{key}} and {{values.name}}
</p>

This is indeed not working. I tried a lot of things and I couldn't make it work properly. I don't want to change my object. I was searching a lot but I didn't find anything that fits my needings.

Share Improve this question edited Mar 22, 2017 at 23:49 Icarus asked Jan 19, 2017 at 14:05 IcarusIcarus 1,6577 gold badges20 silver badges34 bronze badges 0
Add a ment  | 

2 Answers 2

Reset to default 5

I've finally got the answer to my own question.

I only had to create my own filter and check if the properties inside the object have the desired value by using regular expressions:

app.filter('customSearchFilter', function() {
return function(input, term) {
    var regex = new RegExp(term || '', 'i');
    var obj = {};
    angular.forEach(input, function(v, i){
      if(regex.test(v.name + '')){
        obj[i]=v;
      }
    });
    return obj;
  };
});

And apply it in the HTML this way:

<input type="text" ng-model="searchName" />
<ul>      
  <li ng-repeat="(key, val) in items | customSearchFilter:searchName">Both {{key}} and {{val.name}}</li>
</ul>

I created this Plunker to show my solution in action

If you don't need to reuse your filter anywhere else, you can write your filtering function in controller.

scope.customSearchFilter = function(term){
    return function(item) {
        var regex = new RegExp(term || '', 'i');
        return regex.test(item.name + '');
    };
};

Filter argument is a single item, not an array.

Here is examples. 1st variant is with model, and 2nd with plain scope:

https://plnkr.co/edit/ELH8S5GymG8cHfOJqD9G

Post a comment

comment list (0)

  1. No comments so far