Занимают ли пустые элементы массива javascript память? - PullRequest
0 голосов
/ 15 апреля 2020

Обычно я конвертирую свои массивы данных таким образом, чтобы позже я мог быстрее получить доступ к элементам кода, скажем, элемент является объектом со свойством 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 ]

Используются ли они в памяти, если Я беспокоюсь?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Да, да, и вы можете легко убедиться в этом сами. Создайте следующий класс

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

Go для любой chrome встроенной chrome страницы, такой как chrome: // версия / (просто чтобы иметь действительно простую страницу c) , откройте инструменты разработки и выберите инструмент распределения на временной шкале (без стековых записей), начните запись, затем создайте 3 экземпляра

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

Остановите запись и затем проверьте оставшийся размер этих 3 экземпляров, вы увидите, что они очень разные по размеру

вот скриншот enter image description here

0 голосов
/ 15 апреля 2020

Разреженные массивы просто беспорядочные, используйте методы чистых массивов . Используйте .entries(), и он вернет массив массивов. Каждый подмассив представляет собой пару ключ / значение (запись). В этом случае ключи являются индексными числами, поскольку это реальный массив:

let arrayofArrays = objectArray.entries();

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

Сжатие массива с использованием .filter():

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

Затем возьмите этот массив массивов и преобразовать его в карту для быстрого доступа:

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 !== '');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...