【问题标题】:Can I limit the length of an array in JavaScript?我可以限制 JavaScript 中数组的长度吗?
【发布时间】:2012-12-23 13:50:34
【问题描述】:

我想显示产品浏览历史,因此我将产品 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, arr.length - 4) 来确保。你是说接头不工作还是饼干不工作?您正在将 new_cookie 设置为 old_cookie,它仍然包含 5+ 项...

标签: javascript jquery cookies


【解决方案1】:

你没有正确使用拼接:

arr.splice(4, 1)

这将删除索引 4 处的 1 个项目。请参阅 here

我想你想用slice:

arr.slice(0,5)

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      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);
      

      【讨论】:

      • 如果不想对原始数组进行变异,最好先用 slice:var clonedArray = arr.slice(); 克隆,然后更新新克隆数组的长度。
      • 如果你想要一个新数组,只需使用.slice(start, end),不需要设置.length
      • 你说得对,我太专注于突变的风险,以至于忘记了 slice 的初衷正是这个!
      【解决方案4】:
      arr.length = Math.min(arr.length, 5)
      

      【讨论】:

        【解决方案5】:
        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() 添加到末尾,则不会循环遍历数组。

        【讨论】:

        • 是的,你的编辑是对的,感谢阮梓媛的指正!
        【解决方案6】:

        我认为你可以这样做:

        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
        

        【讨论】:

        • 看看this
        • @skillsmuggler 你觉得我对这个网站的第一个贡献是什么?你同意这个解决方案吗?有什么缺点吗?如果你知道的话 ?请告诉我:然后告诉我出了什么问题;欢呼
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        相关资源
        最近更新 更多