切片阵列 - "装袋区域内的意外物品?"

时间:2016-09-21 19:49:04

标签: javascript arrays

我想创建一个空白的数组 - 直到索引(例如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);

4 个答案:

答案 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)

您不需要从for0的{​​{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;
}