我可以在JavaScript中限制数组的长度吗?

时间:2013-01-09 13:39:53

标签: javascript jquery cookies

我想显示产品浏览历史记录,因此我将产品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: '/' });
}

6 个答案:

答案 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