我想使用 Javascript 的 array.filter 从数组中删除项目,因为语法优雅且可读。但是,过滤器似乎没有修改原始数组,它只是返回一个新数组,按照您的要求进行过滤。我的问题是,为什么以下工作没有按我的预期工作?
$scope.clearList = function () {
this.list = this.list.filter(function (item) {
return item.checked == true;
});
//...
}
我希望在返回新过滤的数组后, this.list 现在将只保存过滤后的集合。然而,它不是这样工作的。this.list 最终包含完全相同的项目。更改代码以将过滤后的数组保存在中间变量中表明它确实过滤正确。
我现在已经做了一个解决方法,循环通过过滤的版本并将项目从应该过滤的原始列表中拼接出来,但这并不优雅。我只是想错了吗?
旁注:我正在使用 Angular.js。我不确定这是否重要,但列表来自以下内容:
<div class="list" ng-repeat="list in lists">
<!-- ... -->
<ul>
<li ng-repeat="item in list">
<div>
<label>
<input type="checkbox" ng-model="item.checked"/>
{{item.name}}
</label>
<!-- ... -->
</div>
</li>
</ul>
<button class="btn clear-selected" ng-click="clearList()">
Remove Selected
</button>
</div>
编辑以添加调试信息:我引入了一个临时变量,只是为了查看调试器中发生了什么。
var temp = this.list.filter(function (item) {
return item.checked == true;
});
this.list = temp;
在执行之前,this.List 有 5 个项目,temp 是未定义的。第一行执行后,this.List 有 5 项,temp 有 2 项。执行完最后一行后,this.List 有 2 项,temp 有 2 项。
但是,此后绑定到 this.list 的 UI 似乎没有更新。所以与过滤器无关的事情似乎正在发生。