Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 限制数组大小_Javascript_Arrays - Fatal编程技术网

Javascript 限制数组大小

Javascript 限制数组大小,javascript,arrays,Javascript,Arrays,假设我有一个包含数据元素的数组,在本例中是数字,如下所示: var a = [432, 238, 122, 883, 983]; function add(x) { a.unshift(x); a = a.slice(0, 7); } 我想限制数组,这样每次我向数组中添加一个元素时,它的长度总是保持在7或更小,并删除最早的元素 我当前的aproach如下所示: var a = [432, 238, 122, 883, 983]; function add(x) {

假设我有一个包含数据元素的数组,在本例中是数字,如下所示:

var a = [432, 238, 122, 883, 983];
function add(x) {
    a.unshift(x);
    a = a.slice(0, 7);
}
我想限制数组,这样每次我向数组中添加一个元素时,它的长度总是保持在7或更小,并删除最早的元素

我当前的aproach如下所示:

var a = [432, 238, 122, 883, 983];
function add(x) {
    a.unshift(x);
    a = a.slice(0, 7);
}
它工作得很好,但是有没有一种更优雅的方式来做它,比如一行或其他什么

编辑:
“更优雅”的意思是,我不需要add函数,只需将代码内联到我需要的地方,而无需键入三次,并且只有一行代码也会使代码“更清晰”

在添加时可以检查数组的长度,如果长度已过,则可以移动它(删除第一个元素):

function add(x) {
    a.push(x);
    if (a.length > 7)
        a.shift();
}

推后只需调整长度属性

function add(x) {
    a.unshift(x);
    a.length = a.length < 7 ? a.length : 7;
}
您也可以使用。此外,如果希望将属性添加到数组中,可以将其设置为泛型

Array.prototype.Limit\u push=函数(x){
这是非移位(x);
if(this.maxLength!==未定义&&this.length>this.maxLength)
这个。pop();
}
var a=[];
a、 最大长度=7
对于(变量i=0;i<10;i++){
a、 极限推力(i);
控制台日志(a)
}
var b=[];
对于(变量i=0;i<10;i++){
b、 极限推力(i);
控制台日志(b)

}
仅添加另一种可能的替代方案:

a = [x, ...a.slice(0, 6)];
尽管我个人会选择的(对于改变长度和不支持ES6的较旧环境,有一个“更好”的条件)

参考资料:


如果需要,可以修改
数组
对象的原型。这样,所有阵列都可以有自己的最大长度

这既便宜又有效,但它可能无法与其他库和插件配合使用

Array.prototype.maxLength=Number.MAX\u值;
Array.prototype.add=函数(项){
这个.推(项),;
这个。调整长度();
}
Array.prototype.adjustLength=函数(){
this.length=Math.min(this.length,this.maxLength);
}
var a=[432,238,122,883,983];
a、 最大长度=7;
a、 增加(1);
a、 增加(2);
a、 加(3);//忽略
a、 加(4);//忽略
document.body.innerHTML=''+a.map(函数(i){return'
  • '+i+'
  • '})
    olli:before{content:'\0020\21d2\0020';}
    “一行”并不意味着“更优雅的方式”。你的代码这么好,为什么?这段代码很短,可读性强,做你想做的事,任何人都能理解。你为什么要寻找已经很短的东西的较短变体?
    a=[x,…a.slice(0,6)]
    只要一个指针,如果你的代码运行良好,并且这个问题的目标是改进/优化,那么它就是正确的位置。函数的全部要点是处理添加新数据,然后确保最大长度,这就是它所做的。您的代码将只调用
    add(n)所以它已经以非常合理的方式最小化了。这样做没有任何好处。您仍然需要检查当前长度是否大于7,否则它将扩展带有孔的较小阵列。
    a.length=a.length<7?a、 长度:7---啊,这太糟糕了:-)你可以试试a.length=Math.min(a.length,7)或者
    如果(a.length>7)a.length=7
    ,命令式代码中没有什么不好的地方。@zerkms或
    (a.length>7)和&(a.length=7)
    浏览器对此有什么支持?能否为您的答案提供一些上下文,解释它是如何回答问题的?