Javascript 切片阵列—“切片阵列”;包装区出现意外物品?“;

Javascript 切片阵列—“切片阵列”;包装区出现意外物品?“;,javascript,arrays,Javascript,Arrays,我想创建一个在索引之前为空的数组(示例700) 然后每次我随机添加另一个索引(非常接近最后一个,可能是702703699…) 我希望(在每个新索引上)将数组的长度保持为最高索引数,但要去掉所有不在前十个最高索引中的索引 for循环(其中除最后10个索引外的所有索引上的[i]=null)是不可能的,因为此数组的最后一个索引可能是一个相当大的数字,这将导致迭代代码挂起太长时间 所以我想,Array.slice将是即时的 我不理解的是,如果我的数组长度为700,我会: a=a.slice(a.leng

我想创建一个在索引之前为空的数组(示例700)

然后每次我随机添加另一个索引(非常接近最后一个,可能是702703699…)

我希望(在每个新索引上)将数组的长度保持为最高索引数,但要去掉所有不在前十个最高索引中的索引

for
循环(其中除最后10个索引外的所有索引上的[i]=null)是不可能的,因为此数组的最后一个索引可能是一个相当大的数字,这将导致迭代代码挂起太长时间

所以我想,
Array.slice
将是即时的

我不理解的是,如果我的数组长度为700,我会:

a=a.slice(a.length-10,a.length-1);

为什么我的数组现在是
[700:true].length==701

要除去不在最后10个索引中的
true
值,您可以使用
forEach
迭代
true
元素,它只访问存在的条目。然后使用
delete
可以删除这些条目:

a.forEach ((v, i, a) => {
    if (i < a.length - 10) delete a[i];
});
a.forEach((v,i,a)=>{
如果(i
var a=[];
a[700]=真;
a[702]=真;
a[699]=真;
a[692]=真;//这个应该去掉
//清理:
a、 forEach((v,i,a)=>{
如果(i对于(var i=a.length-13;i要去除不在最后10个索引中的
true
值,可以使用
forEach
迭代
true
元素,该元素只访问存在的条目。然后使用
delete
可以删除这些条目:

a.forEach ((v, i, a) => {
    if (i < a.length - 10) delete a[i];
});
a.forEach((v,i,a)=>{
如果(i
var a=[];
a[700]=真;
a[702]=真;
a[699]=真;
a[692]=true;//应删除此项
//清理:
a、 forEach((v,i,a)=>{
如果(i对于(var i=a.length-13;i您不需要从
0
a.length
for
循环。当您创建稀疏数组时,只有您分配给的索引才会出现在键中,因此您可以使用
对象.keys(a)
来获取它们。您可以对其进行排序并对其进行循环

var indexes = Object.keys(a).map(Number).sort(function(a, b) {
    return a - b;
});
indexes.slice(0, -10).forEach(function(i) {
    delete a[i];
});
您似乎对如何设置长度有些困惑。它总是比最高索引多设置1。尝试运行以下代码段,即使不进行任何切片或迭代,您也会看到长度为
701

var a=[];
a[700]=真;

console.log(a.length);
对于从
0
a.length
循环,不需要
。创建稀疏数组时,只有分配给的索引才会在键中,因此您可以使用
对象.keys(a)
来获取它们。您可以对其进行排序并对其进行循环

var indexes = Object.keys(a).map(Number).sort(function(a, b) {
    return a - b;
});
indexes.slice(0, -10).forEach(function(i) {
    delete a[i];
});
您似乎对如何设置长度有些困惑。它总是比最高索引多设置1。尝试运行以下代码段,即使不进行任何切片或迭代,您也会看到长度为
701

var a=[];
a[700]=真;

console.log(a.length);
如果你想一直看不见,那么这可能是答案。但问题是,如果数组的值索引长度小于
toptockeep
,这将一直到索引
0

var数组=[];
var someBigNumber=999;
var-topNToKeep=10;
数组[someBigNumber]=true;
var计数=100;
(函数_repeat(){
var index=parseInt(someBigNumber*Math.random())+someBigNumber;
array=addIndexAndKeepTopN(数组、索引、topNToKeep);
如果(计数-->0)
_重复();
}());
console.log(数组);
函数addIndexAndKeepTopN(数组、索引、topNToKeep){
数组[索引]=真;
var newArray=[];
对于(var i=array.length;i>=0&&topNToKeep>0;i--){
if(数组中的i){
newArray[i]=true;
托普托保持--;
}
}
返回新数组;

}
如果你想一路盲,那么这可能是答案。但问题是,如果数组的值索引长度小于
topNToKeep
,那么这将一直到索引
0

var数组=[];
var someBigNumber=999;
var-topNToKeep=10;
数组[someBigNumber]=true;
var计数=100;
(函数_repeat(){
var index=parseInt(someBigNumber*Math.random())+someBigNumber;
array=addIndexAndKeepTopN(数组、索引、topNToKeep);
如果(计数-->0)
_重复();
}());
console.log(数组);
函数addIndexAndKeepTopN(数组、索引、topNToKeep){
数组[索引]=真;
var newArray=[];
对于(var i=array.length;i>=0&&topNToKeep>0;i--){
if(数组中的i){
newArray[i]=true;
托普托保持--;
}
}
返回新数组;

}
一定有错误:
a=a.slice(a.length-10,a.length-1);
将使您的数组变短:长度为9。您能澄清一下吗?不确定您正在记录什么,但
。slice
返回一个包含已删除项的新数组并修改现有数组。我相信您不想在这种情况下重新分配。控制台显示[undefined×9],但数组仍然等于[700:true].length==701!它的索引在保存中很重要(你是对的还是错的)@JesseKernaghan没有重新分配我仍然得到长度701
slice
返回的数组总是从
0
开始索引,它不会使用原始数组中的索引。一定有错误:
a=a.slice(a.length-10,a.length-1);
将使您的数组变短:长度为9。您能澄清一下吗?不确定您正在记录什么,但
.slice
返回一个包含已删除项的新数组并修改现有数组。我相信您不想在此实例中重新分配。控制台显示[undefined×9]但是数组仍然等于[700:true].length==701!这是在保存时非常重要的索引