以两种不同的方式编写函数:一种方式会导致 TypeError,另一种方式不会.为什么
Writing a function in two different ways: one way results in a TypeError and the other does not. Why?
我遇到了一个我不明白发生了什么的问题。这是设置:用户进入屏幕并输入姓氏。我取姓氏并搜索电话簿(当用户进入屏幕时,整个电话簿已被检索,因此它只是作为一个又大又胖的 JavaScript 数组坐在那里)。
假设电话簿对象的每个元素都包含:姓氏、名字和电话号码。现在,我将采用用户输入的姓氏,并在电话簿中循环查找匹配的姓氏。然后,我将每个匹配的元素推送到一个数组中,并向用户显示该数组。
我编写了以两种不同方式执行此操作的方法。在第一种方式中,它返回对象列表。以第二种方式(我的偏好),抛出一个类型错误。
这是第一种方法
$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 条件:
if(lastName==phoneBook[i].lastName)
有人可以向我解释为什么第二种方法会导致错误吗?
谢谢。
由于您要实现的是过滤结果列表,因此我建议您使用angularJs过滤器
我用一个简单的例子为你准备了一个jsfiddle:https://jsfiddle.net/fb0r7z0q/
这是关键行:
<li ng-repeat="entry in phonebook | filter:qname">
qname 是你的$scope.姓氏
相关文章:
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 使用while循环+break是一种可接受的方式;goto;手术的结束
- JavaScript Array unshift() 以一种不可变的方式
- Angularjs:如何让ui选择只有一种方式的模型竞标
- 正在寻找一种跨移动浏览器兼容的方式,通过内置麦克风进行录制
- 另一种显示和隐藏按钮的方式
- 当按下箭头键时,我的图像以一种奇怪的方式跳跃(HTML+JS)
- 单击()的另一种方式
- 有没有一种优雅的方式来告诉esint,以确保我们're没有使用任何ES6语法/函数
- Rails 以一种方式格式化 DateTime.now 和 DateTime.yesterday 另一种方式 - 我如何
- 以这种方式使用if/else-if/else是一种很好的做法
- 有没有一种快捷方式可以让我用javascript或jQuery设置对象的字段
- 另一种方式是Javascript中的函数堆叠
- CSS Div 类之间的转换仅以一种方式发生
- 有没有一种方法可以制作一个prezi,然后以某种方式将其转换为html和css类型的代码
- require.js是require的另一种方式
- 注入jquery会完全改变页面结果——这是一种糟糕的方式
- 以两种不同的方式编写函数:一种方式会导致 TypeError,另一种方式不会.为什么
- 在JavaScript中分配对象属性会以一种奇怪的方式更改对象
- KnockoutJS的select会以一种意想不到的方式影响可观察对象,这取决于select是什么时候创建的