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

我可以在JavaScript中限制数组的长度吗?,javascript,jquery,cookies,Javascript,Jquery,Cookies,我想显示产品浏览历史记录,因此我将产品ID存储在浏览器cookie中 因为历史记录列表限制为5项,所以我将cookie值转换为一个数组,然后检查其长度并剪切冗余项 下面的代码是我尝试过的,但它不起作用;未删除数组项 我想问一下如何限制数组长度,使其只能存储5项 或 如何剪切数组索引4之后的项目 var id = product_id; var browseHistory = $.cookie('history'); if (browseHistory != null) { var old_c

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

您没有正确使用接头:

arr.splice(4, 1)
这将删除索引4中的1项。看

我想你应该使用:

这将返回位置0到4的元素


这假设您的所有其余代码(cookies等)都正常工作

您需要在删除项目后实际使用缩短的数组。您正在忽略缩短的数组

将cookie转换为数组。您减少了数组的长度,然后就不再使用缩短的数组。相反,您只需使用旧的cookie(未排序的cookie)

您应该将缩短的数组转换回带有
.join(“,”
的字符串,然后将其用于新的cookie,而不是使用未缩短的
旧的\u cookie

您可能也没有正确使用
.splice()
,但我不知道缩短阵列的确切目标是什么。您可以了解
.splice()
的确切功能,最简单的方法是将
.length
属性设置为所需的长度:

arr.length = 4;
这也是重置/清空阵列的理想方法:

arr.length = 0;

注意事项:设置此属性也会使数组变长:如果其长度为2,则运行
arr.length=4
将向其添加两个
未定义的
项。或许可以添加一个条件:

if (arr.length > 4) arr.length = 4;
或者:

arr.length = Math.min(arr.length, 4);
此解决方案在p5js这样的动态环境中工作得更好。我把它放在draw调用中,它动态地钳制数组的长度

问题在于:

arr.slice(0,5)
…是因为它仅从每个绘图帧的数组中移除固定数量的项,如果用户可以添加多个项,则无法保持数组大小不变

问题在于:

if (arr.length > 4) arr.length = 4;

…是因为它从数组的末尾提取项目,因此如果您也使用push()添加到数组的末尾,则不会在数组中循环。我想您可以执行以下操作:

let数组=[];
array.length=2;
defineProperty(数组,'length',{writable:false});
数组[0]=1/[1,未定义]
数组[1]=2/[1,2]
数组[2]=3/[1,2]->不添加任何内容,并以静默方式失败
array.push(“某物”)//但这会抛出一个未捕获的类型错误

您的拼接看起来不错,但您可以执行
arr.splice(4,arr.length-4)
以确保。你是说拼接不起作用还是曲奇?您正在将new_cookie设置为old_cookie,其中仍然包含5个以上的项目…是的,您的编辑是正确的,感谢阮子元的更正!看看@Skill走私者你觉得我对这个网站的第一次贡献怎么样?你同意这个解决方案吗?有什么缺点吗?如果你知道的话?请告诉我:那么告诉我怎么了;Cheers如果不想改变原始数组,最好先用slice克隆它:
var clonedArray=arr.slice()
然后更新新克隆数组的长度。如果你想要一个新数组,只需使用
.slice(开始,结束)
,无需同时设置
.length
你是对的,我太关注突变的风险了,以至于我忘了slice的最初用途正是这个!
var  arrLength = arr.length;
if(arrLength > maxNumber){
    arr.splice( 0, arrLength - maxNumber);
}
arr.slice(0,5)
if (arr.length > 4) arr.length = 4;