我想显示产品浏览历史记录,因此我将产品ID存储在浏览器Cookie中。
因为历史记录列表限制为5个项目,所以我将cookie值转换为数组,然后检查它的长度并减少冗余。
以下代码是我尝试过的,但它不起作用;数组项未被删除。
我想问一下如何限制数组长度,以便它只能存储5个项目?
或者
如何在数组索引4之后剪切项目?
var id = product_id;
var browseHistory = $.cookie('history');
if (browseHistory != null) {
var old_cookie = $.cookie('history');
var new_cookie = '';
if (old_cookie.indexOf(',') != -1) {
var arr = old_cookie.split(',');
if (arr.length >= 5) {
arr.splice(4, 1)
}
}
new_cookie = id + ',' + old_cookie;
$.cookie('history', new_cookie, { expires: 7, path: '/' });
} else {
$.cookie('history', id, { expires: 7, path: '/' });
}
答案 0 :(得分:58)
您未正确使用拼接:
arr.splice(4, 1)
这将删除索引4处的1个项目。请参阅here
我想你想使用slice:
arr.slice(0,5)
这将返回位置0到4的元素。
这假设您的所有其余代码(cookie等)都能正常工作
答案 1 :(得分:14)
<ItemsControl Name="PathControl">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Line
Name="Path"
Stroke="Red"
StrokeThickness="4"
X1="{Binding
StartCoordinates.X,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
Y1="{Binding
StartCoordinates.Y,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
X2="{Binding
EndCoordinates.X,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
Y2="{Binding
EndCoordinates.Y,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="{Binding EndCoordinates.Y}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 2 :(得分:10)
fastest最简单的方法是将.length
属性设置为所需的长度:
arr.length = 4;
这也是重置/清空数组的理想方法:
arr.length = 0;
警告:设置此属性也可以使数组长于:如果长度为2,则运行arr.length = 4
会向其中添加两个undefined
项。也许添加一个条件:
if (arr.length > 4) arr.length = 4;
可替换地:
arr.length = Math.min(arr.length, 4);
答案 3 :(得分:3)
var arrLength = arr.length;
if(arrLength > maxNumber){
arr.splice( 0, arrLength - maxNumber);
}
这种灵魂在像p5js这样的动态环境中效果更好。我把它放在绘图调用中,它动态地夹住数组的长度。
问题:
arr.slice(0,5)
...每个绘制框架只需要固定数量的项目,如果用户可以添加多个项目,则无法保持数组大小不变。
问题:
if (arr.length > 4) arr.length = 4;
...它是将数据从数组的末尾移除,因此如果你还使用push()添加到数组中,它将不会循环遍历数组。
答案 4 :(得分:1)
从中删除项目后,您需要实际使用缩短的数组。你忽略了缩短的数组。
您将cookie转换为数组。您减少了数组的长度,然后您永远不会使用缩短的数组。相反,你只需使用旧的cookie(未经训练的cookie)。
您应该将缩短的数组转换回.join(",")
的字符串,然后将其用于新Cookie,而不是使用未缩短的old_cookie
。
您可能也没有正确使用.splice()
,但我不确切地知道您缩短阵列的目标是什么。您可以阅读.splice()
here的确切功能。
答案 5 :(得分:0)
我认为您可以做到:
let array = [];
array.length = 2;
Object.defineProperty(array, 'length', {writable:false});
array.push("something"); //throws an Uncaught TypeError