我认为我太晚才能弄明白这一点。基本上,我有一个主数组。我循环它并删除一个元素,如果我找到它。我为4个元素做这个。
最后我想显示任何剩余的元素。问题是我删除元素后没有正确刷新我的数组。
这里是我使用的代码,我认为这些代码太过蛮力而且不够优雅。
var masks = ["valueOne","valueTwo","valueThree","valueFour","valueFive"];
$.each(masks,function(key,value){
if("valueOne" === value){
// do something
masks.splice($.inArray(value, masks),1);
}else if("valueTwo" === value){
// do something
masks.splice($.inArray(value, masks),1);
}else if("valueThree" === value){
masks.splice($.inArray(value, masks),1);
}else if("valueFour" === value){
// do something
masks.splice($.inArray(value, masks),1);
}
});
console.log( masks.toString() );
我希望控制台记录" valueFive"但它并没有。它记录了这个:
valueTwo,valueFour,valueFive
更新后刷新数组的正确方法是什么?感谢任何有用的提示。
答案 0 :(得分:4)
问题是$.each()
正在通过索引迭代数组。
(function(key,value){ ... })( 0, "valueOne" );
(function(key,value){ ... })( 1, "valueThree" );
(function(key,value){ ... })( 2, "valueFive" );
"valueTwo"
和"valueFour"
被跳过,因为.splice()
修改了数组,将它们转移到$.each()
已访问过的索引。
masks[0] === "valueTwo"
masks[1] === "valueFour"
对此的快速解决方案是提供要迭代的Array的克隆,一个在整个过程中保持不变的克隆,因此您可以安全地修改原始。
$.each(masks.slice(0), function (key, value) {
// ...
});
答案 1 :(得分:1)
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
CGPoint centerPoint = CGPointMake(self.clnViewWorkoutTitles.center.x + self.clnViewWorkoutTitles.contentOffset.x,
self.clnViewWorkoutTitles.center.y + self.clnViewWorkoutTitles.contentOffset.y);
NSIndexPath *centerCellIndexPath = [self.clnViewWorkoutTitles indexPathForItemAtPoint:centerPoint];
[self.clnViewWorkoutContent scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:centerCellIndexPath.item inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
[self.clnViewWorkoutTitles scrollToItemAtIndexPath:centerCellIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];}
答案 2 :(得分:0)
我认为正确的方法是使用JavaScript的array.filter方法。 如果此函数返回false,则Filter需要一个函数并删除一个元素。
mask.filter(function(elem, index, array) {
if(elem==="value") return false;
return true;
}