2016-03-03 65 views
0

我遇到过一个问题,我不明白发生了什么事。设置如下:用户进入屏幕并输入姓氏。我取最后一个名字并搜索一个电话簿(当用户进入屏幕时,整个电话簿已经被取回,因此它只是坐在那里作为一个胖胖的JavaScript数组)。以两种不同的方式编写函数:一种方式导致TypeError,另一种导致TypeError。为什么?

让我们假设电话簿对象的每个元素包含:姓氏,名字和电话号码。现在,我将输入用户输入的姓氏,并在电话簿中循环查找匹配的姓氏。然后,我会将每个匹配元素推送到一个数组中,并将该数组显示给用户。

我已经写了两种不同的方法来做到这一点。第一种方式返回对象列表。在第二种方式(我的首选)中,会引发TypeError。

这是第一种方法

$scope.getMatchingLastNames = function(){ 
for(i=0; i<$scope.phoneBook.length; i++){ 
    if($scope.lastName==$scope.phoneBook[i].lastName){ 
      $scope.filteredArray.push($scope.phoneBook[i]); 
    } 
}; 

第二种方法:

$scope.getList = function(){ 
    $scope.filteredArray = getLastNames($scope.lastName, 
     $scope.phoneBook, $scope.phoneBook.length); 
} 

其中要求

function getLastNames(lastName, phoneBook, length) 
{ 
    var filteredArray = []; 
    for(var i=0; i<length; i++){ 
     if(lastName==phoneBook[i].lastName){ 
      filteredArray.push(phoneBook[i]); 
     } 
    } 
    return filteredArray; 
} 

当我运行第二种方法我会在Chrome中的错误控制台如下:

TypeError: Cannot read property 'lastName' of undefined 

和错误指向,如果条件:

if(lastName==phoneBook[i].lastName) 

为什么第二种方法导致错误有人能解释一下吗?

谢谢。

+0

注意,解析器将加载FNS decla的/ PASE-机构红色像这样'function getLastNames'第一个...然后runetime会威胁'var x = function()..'像valiables和尸体将被贴上像runetime – animaacija

+0

如果你重写'function getLastNames(lastName,phoneBook,length )'在'getLastNames =函数(lastName,phoneBook,length)'这样的方式? – animaacija

+0

@animaacija:谢谢。我会研究JavaScript解释器。我对它的工作原理并不了解,所以这可能是一个好的第一步。为了回答你的第二个问题:我重构了代码,因为其他开发人员最终为许多变量添加了$ scope,所以我试图尽量减少清理代码。例如,第一个方法有一个$ scope.phoneBook,但它不会绑定到视图中的任何内容。 – jrDeveloper

回答

1

既然你要实现的目标是要筛选结果列表,我建议你使用angularJs过滤器

我准备了的jsfiddle给你一个简单的例子: https://jsfiddle.net/fb0r7z0q/

这是关键行:

<li ng-repeat="entry in phonebook | filter:qname"> 

qname的是你的$ scope.lastName

相关问题