84

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

6 回答 6

152

您没有正确使用拼接:

arr.splice(4, 1)

这将删除索引 4 处的 1 项。请参见此处

我想你想使用slice

arr.slice(0,5)

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

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

于 2013-01-09T13:47:15.400 回答
46

最快和最简单的方法是将.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);
于 2016-03-04T07:39:47.200 回答
26
arr.length = Math.min(arr.length, 5)
于 2017-02-08T13:45:54.120 回答
8
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().

于 2018-04-10T19:08:31.357 回答
3

我认为你可以这样做:

let array = [];
array.length = 2;
Object.defineProperty(array, 'length', {writable:false});


array[0] = 1 // [1, undefined]

array[1] = 2 // [1, 2]

array[2] = 3 // [1, 2] -> doesn't add anything and fails silently

array.push("something"); //but this throws an Uncaught TypeError
于 2019-12-20T19:19:37.573 回答
1

从中删除项目后,您需要实际使用缩短的数组。您忽略了缩短的数组。

您将 cookie 转换为数组。你减少了数组的长度,然后你永远不会使用那个缩短的数组。相反,您只需使用旧的 cookie(未缩短的 cookie)。

您应该将缩短的数组转换回字符串,.join(",")然后将其用于新的 cookie,而不是使用old_cookie未缩短的。

您也可能没有.splice()正确使用,但我不知道您缩短阵列的确切目标是什么。您可以阅读.splice() 此处的确切功能。

于 2013-01-09T13:47:24.690 回答