【问题标题】:Do javascript array's empty elements take up memory?javascript数组的空元素会占用内存吗?
【发布时间】:2020-07-28 03:48:54
【问题描述】:

通常我转换我的数据数组的方式可以让我稍后在代码中更快地访问元素,假设元素是具有 ID 属性的对象,然后我将此属性设置为数组中元素的键。举个例子,假设我有这个:

[{id: 1, name: "a"}, {id: 2, name: "b"}, etc..]

变成

[1 => {name: "a"}, 2 => {name: "b"}, etc...]

然后我可以简单地使用a[2] 而无需遍历数组来查找带有ID = 2 的元素

问题是某些值可能会丢失,从而导致数组中的元素为空:

  1599,
  <2 empty items>,
  1105,
  892,
  <2 empty items>,
  86,
  1695,
  999,
  <1 empty item>,
  967,
  1663,
  <3 empty items>,
  1673,
  <4 empty items>,
  1043,
  998,
  1350,
  1688,
  <3 empty items>,
  2013,
  <2 empty items>,
  136,
  1463,
  1632,
  <1 empty item>,
  1827,
  1680,
  1293,
  <2 empty items>,
  844,
  1696,
  1108,
  <1 empty item>,
  925,
  <6 empty items>,
  1144,
  <7 empty items>,
  905,
  <3 empty items>,
  2006,
  <7 empty items>,
  1876,
  <2 empty items>,
  1609,
  <2 empty items>,
  2232,
  <1 empty item>,
  1561,
  <1 empty item>,
  2203,
  <1 empty item>,
  1400,
  <3 empty items>,
  1381,
  1287,
  1312,
  <2 empty items>,
  933,
  ... 4011 more items ]

这些是否使用内存,我应该担心吗?

【问题讨论】:

标签: javascript arrays memory


【解决方案1】:

使用cleaner array methods 时,稀疏数组很麻烦。使用.entries(),它将返回一个数组数组。每个子数组都是一个键/值对(一个条目)。在这种情况下,键是索引号,因为它是一个真正的数组:

let arrayofArrays = objectArray.entries();

// [[0, {object}], [1, {object}], [2, {object}],...]

使用.filter() 压缩数组:

objectArray.filter(obj => obj !== undefined && obj != null && obj !== '');

然后获取该数组并将其转换为Map 以便于访问:

let arrayMap = new Map(arrayOfArrays);

arrayMap.get(2);

// returns the 3rd Object 

演示

let objArray = [{id: 1, name: "a"}, {id: 2, name: "b"}, null, {id: 1, name: "c"}];

let cleanObjArray = compactArray(objArray);

let arrayMap = new Map(cleanObjArray.entries());
// [[0, {id: 1, name: "a"}], [1, {id: 2, name: "b"}], [2, {id: 1, name: "c"}];

console.log(arrayMap.get(2));

function compactArray(array) {
  return array.filter(obj => obj !== undefined && obj != null && obj !== '');
}

【讨论】:

  • 谢谢,这真的很好,但我有一种感觉,对于较大的数组,我的凌乱方法要快一点,在我的情况下,如果它没有大量的内存使用,速度很重要,因此我的问题
  • 您的数据肯定在 kifillions 中,尽管现代浏览器最近相当令人印象深刻。
【解决方案2】:

是的,他们会这样做,而且您可以轻松地验证自己。 创建如下类

class EmptyArray {
    constructor(size) {
        this.array = new Array(size)
    }
}

转到任何 chrome 内置的 chrome 页面,例如 chrome://version/(只是为了有一个非常简单的静态页面),打开开发工具并选择时间轴上的分配工具选项(没有堆栈记录),开始记录然后创建 3实例

a = new EmptyArray(1)
a = new EmptyArray(90)
a = new EmptyArray(90000)

停止录制,然后检查这3个实例的保留大小,你会发现它们的大小差别很大

这里是截图

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2022-07-17
    相关资源
    最近更新 更多