我想使用Javascript的array.filter从数组中删除项目,因为语法优雅且可读。但是,似乎过滤器不会修改原始数组,它只是返回一个新数组,并按您的要求进行过滤。我的问题是,为什么不按照我的预期工作?使用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不会更新。因此,与过滤器无关的事情似乎正在进行。
嗯,我已经做了一个涉及foreach的解决方法。它似乎必须有一个更清洁的方式。此外,你是不是应该修改你正在播放的歌曲集,例如从中删除物品?我知道在C#.NET中这是真的。 – jtheis
是的,我早点读错了你的问题。删除了我以前的评论。 – bits
你有一个地方的例子页面吗?这可能有帮助。唯一让我困惑的是你过滤this.list,并且没有看到任何$ scope。我可能会遇到一些错误,但除非您的列表是$ scope的一个属性,否则UI无法更新。哦,还有一件事:你在指令中有一个指令(列表属于第一个ng-repeat的范围,据我记忆)这可能非常棘手,我猜测错误在某处。但也许我错了:) –