尝试使用AngularJS自定义过滤器从文本块中提取数字

时间:2015-06-20 13:29:21

标签: javascript angularjs

我想要创建的是一个过滤器,它会将文本中的数字拉出文本框。例如:

用户类型:猫去了4家商店,买了3袋猫砂1美元。

结果将是:[4,3,1]

过滤器会看到因为之前的过滤器[''' cat',' go',' to',& #39; 4' ...]

所以我试图创建的是一个for循环,它将遍历数组并检查每个项目以查看它是否实际上是一个数字。但是,for循环在应用程序未被注释时会中断。任何帮助表示赞赏。

filter('showNum', function() {    
//   this filter is not complete but it will return only numbers from an array
    return function isNumeric(title){
    var numbers, i, len, numberToAdd;
    numbers = [];
    len = title.length;

//      for(i=0; i<len; i+=1){
//          numberToAdd = title[i]; 
//          if(!isNAN(numberToAdd)===False);    {numbers.push(numberToAdd);} 
    return numbers;
      };

  })

2 个答案:

答案 0 :(得分:1)

我会将过滤器更改为like this

javascript

.filter('showNum', function() {
  return function(input) {

    if (!input)
    {
      return [];
    }

    return input
      .split(' ')
      .filter(function(item){
        return item && !isNaN(item);
      })
      .map(function(item){
        return parseInt(item);
      })

  };
});

<强> HTML

  <body ng-controller="MainCtrl">
    <input type="text" ng-model="input">
    <p>result: {{ input | showNum }}</p>
  </body>

enter image description here

http://plnkr.co/edit/Hp91dIXbThzvnwzIFbVn?p=preview

答案 1 :(得分:0)

wZVanG是正确的,这里是使用正则表达式重新访问函数但尊重过滤器的签名,以便它返回一个int数组并将数组作为参数。

 filter('showNum', function() {    
    //this filter returns only numbers from an array
        return function isNumeric(title){
        var numbers, i, len, numberToAdd;
        numbers = [];
        var theString = title.toString();

        var numbersAsStrings = theString.match(/\b\d+\b/g);

       numbersAsString.forEach(function(s){
           numbers.push(parseInt(s));
       });

       return numbers;

 })