Разница между инициализацией длины массива и назначением индекса против многократного нажатия - PullRequest
0 голосов
/ 20 марта 2019

Работая над составлением списка имен листов, я столкнулся с этим вопросом: Перечислите названия листов в Google Sheets и пропустите первые два

Спасая вас, клик, решение этого человека: (Урезанный, псевдокод)

getSheets() // Get all the sheets in spreadsheet workbook
  var out = new Array( sheets.length+1 ) ;

  for (var i = 1 ; i < sheets.length+1 ; i++ )
    out[i] = [sheets[i-1].getName()];
  return out

Мое решение использовало бы:

...
var sheetName = sheet[i].getName();
out.push(sheetName);

Первое решение, по-видимому, динамически создает пустые значения массива, а затем объявляет их значение. Хотя я всегда просто вставляю новые значения в массив.

В чем разница?

В каких ситуациях одно лучше другого?

В каких ситуациях следует избегать?

1 Ответ

0 голосов
/ 20 марта 2019

Ваш код и исходный код делают совершенно разные вещи.

Предполагая, что sheets содержит объекты, которые возвращают имена "sheet1", "sheet2" и "sheet3" из getName,Исходный код создает массив, который выглядит следующим образом:

[
    (missing),
    ["sheet1"],
    ["sheet2"],
    ["sheet3"]
]

Обратите внимание на две вещи:

  1. Нет записи с индексом 0. (Буквально не существует вообще,который слегка отличается от существующего и содержит значение undefined.)
  2. Другие записи являются одноэлементными массивами , каждая из которых содержит имя листа.

Вместо этого ваш код создает это:

[
    "sheet1",
    "sheet2",
    "sheet3"
]

Предположительно, у автора была причина пропустить индекс 0 и создать подчиненные массивы (я думаю, они передавали этот массив результатов в некоторыеAPI-функция, которая ожидает что-то в этой форме).

Так что на самом деле здесь нет «лучше» или «хуже», просто другое.

Если ваш фундаментальный вопрос таков:

var original = ["one", "two", "three"];
var updated = [];
for (var i = 0; i < original.length; ++i) {
    updated[i] = original[i].toUpperCase(); // Or whatever
}

лучше / хуже, чем это:

var original = ["one", "two", "three"];
var updated = [];
for (var i = 0; i < original.length; ++i) {
    updated.push(original[i].toUpperCase()); // Or whatever
}

ответ: это действительно вопрос стиля.Производительность между этими двумя компонентами не сильно различается (и редко имеет значение), и забавно, что один способ работает быстрее на некоторых механизмах JavaScript, а другой - быстрее на других.

Оба из них, вероятно, лучше выразить с помощью map:

var original = ["one", "two", "three"];
var updated = original.map(function(entry) { return entry.toUpperCase(); });

Я думаю, что Google Sheets имеет map, хотя в большинстве случаев он имеет только функции уровня ES3.


Примечание: new Array почтиникогда не правильный способ создать массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...