可以将空插槽推入阵列吗?

时间:2019-06-19 04:04:17

标签: javascript arrays

我正在构建自己的地图方法,使其与本地地图方法一样近。 由于本机映射将(我认为)更改后的值压入一个新数组,因此它仍然保留空白插槽。我找不到能将空插槽推入阵列的解决方案,如下例所示。

[1, 2, 3].push(some code) // [1, 2, 3, empty]

我尝试推送一个带有散列运算符arr.push(...(new Array(1)))arr.push(...[,])前缀为空项目的数组,但这只推送了undefined

我通过不使用push来解决https://stackoverflow.com/a/18147076/196526的问题,而是将值分配给数组索引,从而将跳过的索引设置为空。

但是我正在写这篇文章,看看是否有人知道是否有可能使用push方法将空插槽推入数组。

3 个答案:

答案 0 :(得分:2)

否,不可能,不是使用push方法。 empty仅在数组具有特定长度时才存在,但数组的整数属性在某个索引处不存在。这称为稀疏数组,不能使用push(或其他数组方法(如果在非稀疏数组上调用了它们,并且使用非稀疏数组)创建)。

唯一的方法是将索引分配给尚不存在 lower 索引的索引。

在浏览器控制台(而不是代码段控制台)中查看以下两个代码段的结果:

const arr = [];
arr[1] = 'a';
console.log(arr);

或将数组的.length设置为该数组具有的最后一个索引上方:

const arr = [];
arr.length = 1;
console.log(arr);

但是上面的两种方法很奇怪,并且可能没有充分的理由使用。最好完全避免稀疏数组。

请记住,空插槽与undefined不同,完全有可能将其作为数组值:

const arr = [];
arr.push(undefined);
console.log(arr);

答案 1 :(得分:0)

您可以通过增加数组长度在数组中创建一个空插槽:

var a = []
a.push(1)
a.length++
a.push(3)
console.log(a)
console.log(1 in a) // anything at index 1?

或者,您可以推送某些内容然后将其删除:

var a = []
a.push(1)
a.push(2)
a.push(3)
delete a[1]
console.log(a)
console.log(1 in a) // anything at index 1?

答案 2 :(得分:0)

实际上不需要在实现中推送到新数组。您可以简单地进行new Array(this.length),其中this.length是要通过长度映射的数组。

例如,考虑以下map实现:

if (!Array.prototype.mapIt) {
  Object.defineProperty(Array.prototype, "mapIt", {
    value: function(fn) {
      if (this === null) {
        throw new TypeError('Array.prototype.mapIt called on null or undefined');
      }
      if (typeof fn !== 'function') {
        throw new TypeError('predicate must be a function');
      }
      let _array = this.filter(x => x != null) // remove empty values
      let result = new Array(_array.length) // the new array we will return
      for (var i = 0; i < _array.length; i++) {
        result[i] = fn.call(arguments[1], _array[i], i, _array) // call the predicate
      }
      return result;
    }
  });
}

let arr = [1, 2, , , 3] // the test array

let result = arr.mapIt((c, i, a) =>
  console.log(`current: ${c}`, `index: ${i}`, `array: ${a}`) || c + 2)

console.log('result: ', result)
console.log('original array: ', arr)

希望这可以帮助您了解可能的map实施方案。