我想创建一个空白的数组 - 直到索引(例如700)
Text
然后每次我随机添加另一个索引(非常接近最后可能702,703,699 ...)
我希望(在每个新索引上)将数组的长度保持为最高索引号,但要删除不在前十个最高索引中的每个索引。
一个var a=[];
a[700]=true;
//produces [700:true].length==700
循环(其中a [i] =除了最后10个索引之外的所有内容都为null)是不可能的,因为这个数组的最后一个索引可能是一个相当大的数字,会导致迭代代码挂得太久了!
所以我认为for
将是即时的......
我不理解的是,如果我的数组长度为700,那么:
Array.slice
为什么我的阵列现在是a=a.slice(a.length-10,a.length-1);
?
答案 0 :(得分:1)
要删除不在最后10个索引中的true
值,您可以使用true
迭代forEach
元素,仅访问存在的条目。然后使用delete
,您可以删除这些条目:
a.forEach ((v, i, a) => {
if (i < a.length - 10) delete a[i];
});
var a=[];
a[700]=true;
a[702]=true;
a[699]=true;
a[692]=true; // this one should be removed
// clean-up:
a.forEach ((v, i, a) => {
if (i < a.length - 10) delete a[i];
});
// show last 13 elements:
for (var i=a.length-13; i<a.length; i++) {
console.log (i, a[i]);
}
// output length
console.log('length: ', a.length);
答案 1 :(得分:1)
您不需要从for
到0
的{{1}}循环。创建稀疏数组时,只有您指定的索引才会出现在键中,因此您可以使用a.length
来获取它们。你可以对它进行排序并循环它们。
Object.keys(a)
您似乎对如何设置长度感到困惑。它始终设置为比最高指数多1。尝试运行以下代码段,即使没有进行任何切片或迭代,您也会看到长度为var indexes = Object.keys(a).map(Number).sort(function(a, b) {
return a - b;
});
indexes.slice(0, -10).forEach(function(i) {
delete a[i];
});
。
701
答案 2 :(得分:1)
var a=[]; // empty array (length 0)
a[700] = true; // You fill the value "true" to the case with index 700 in the array "a"
a.length; // 701 : logic because we had a value on the 700 index
a = a.slice(a.length-10, a.length-1); //[undefined × 9] 9 elements undefined
// that's create a shallow copy of the array
// from the index 691(included) to 700(not included)
a.length; // 9
答案 3 :(得分:1)
如果你想一路盲目,那么这可能就是答案。但问题是,如果数组的值索引长度小于0
,那么这将会一直到索引topNToKeep
:
var array = [];
var someBigNumber = 999;
var topNToKeep = 10;
array[someBigNumber] = true;
var count = 100;
(function _repeat() {
var index = parseInt(someBigNumber * Math.random()) + someBigNumber;
array = addIndexAndKeepTopN(array, index, topNToKeep);
if (count-- > 0)
_repeat();
}());
console.log(array);
function addIndexAndKeepTopN(array, index, topNToKeep) {
array[index] = true;
var newArray = [];
for (var i = array.length; i >= 0 && topNToKeep > 0; i--) {
if (i in array) {
newArray[i] = true;
topNToKeep--;
}
}
return newArray;
}
但我现在能找到的最好方法是使用Object.keys
方法:
console.clear();
var array = [];
var someBigNumber = 1000;
var topNToKeep = 10;
array[someBigNumber] = true;
var count = 100;
(function _repeat() {
var index = parseInt(someBigNumber * Math.random()) + someBigNumber;
array = addIndexAndKeepTopN(array, index, topNToKeep);
if (count-- > 0)
_repeat();
}());
console.log(Object.keys(array).length, Object.keys(array), array);
function addIndexAndKeepTopN(array, index, topNToKeep) {
array[index] = true;
var keys = Object.keys(array);
if (keys.length >= topNToKeep) {
array = [];
keys = keys.map(Number)
.sort().reverse().splice(0, topNToKeep);
keys.forEach(k => array[k] = true);
}
return array;
}