Как создать массив в JavaScript, индексирование которого начинается с 1?

По умолчанию индексирование каждого массива JavaScript начинается с 0. Я хочу создать массив, индексирование которого начинается с 1.

Я знаю, должно быть очень тривиально... Спасибо за вашу помощь.

Ответы

Ответ 1

Это не тривиально. Это невозможно. Лучшее, что вы можете сделать, это создать объект, используя числовые свойства, начиная с 1, но это не то же самое.

Почему именно вы хотите, чтобы он начинался с 1? Или:

  • Начните с 0 и при необходимости настройте свои индексы; или

  • Начните с нуля и просто игнорируйте индекс 0 (т.е. используйте только индексы 1 и выше).

Ответ 2

Так как этот вопрос также появляется для поиска Google, такого как "начальный массив javascript в 1", я дам другой ответ:

Массивы можно нарезать. Таким образом, вы можете получить нарезную версию массива следующим образом:

var someArray = [0, 1, 2, 3];

someArray.slice(1);
[1, 2, 3]

someArray.slice(2, 4);
[2, 3]

Источник: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

Ответ 3

Простое решение - заполнить нулевой элемент:

var map = [null, 'January', 'February', 'March'];
'First month : ' + map[1];


Семантически было бы лучше использовать объект:

var map = {1:'January', 2:'February', 3:'March'};
'First month : ' + map[1];

Обратите внимание, что эти ключи на самом деле не являются целочисленными, ключи объектов всегда являются строками.
Кроме того, мы не можем использовать точечную запись для доступа. (MDN - Средства доступа к собственности)


Я бы выбрал первое решение, которое мне кажется менее запутанным.

Ответ 4

Хорошо, согласно @cletus, вы не могли этого сделать, потому что это встроенная функция javascript, но вы можете пойти немного по-другому, если вы все еще этого хотите. Вы можете написать свои собственные зависящие от индекса функции Array (например, reduce, map, forEach), чтобы начать с 1. Это не сложная задача, но все же спросите себя: зачем мне это нужно?

Array.prototype.mapWithIndexOne = function(func) {
  const initial = []
  for (let i = 1; i < this.length + 1; i++) {
    initial.push(func(this[i - 1], i))
  }
  return initial
}

const array = ['First', 'Second', 'Third', 'Fourth', 'Fifth']

console.log(array.mapWithIndexOne((element, index) => '${element}-${index}'))
// => ["First-1", "Second-2", "Third-3", "Fourth-4", "Fifth-5"]

Codepen: https://codepen.io/anon/pen/rvbNZR?editors=0012

Ответ 5

Вы можете использовать delete для удаления первого элемента следующим образом:

let arr = ['a','b','c'];
delete arr[0];

console.log(arr[0]);
console.log(arr[1]);

Ответ 6

Сначала добавьте эту функцию в коды javascript:

var oneArray = function(theArray)
{
    theArray.splice(0,0,null);
    return theArray
}

Теперь используйте его так:

var myArray= oneArray(['My', 'name', 'is', 'Ram']);

alert(myArray[1]); << this line show you:   My

Смотрите живая демонстрация

Ответ 7

Я столкнулся с ситуацией, когда мне нужно, чтобы массив начинался с индекса 1. Вот что я сделал:

var products = ['bar', 'baz'];

products = $.makeArray(products); // necessary to unshift a jQuery object
products.unshift('foo'); // add "foo" to the beginning of the array

$(products).each(function(index) {
    if (index === 0) {
        return true; // we will skip "foo"
    }

    // From now on we can use products[index] starting from 1

});

Ответ 8

Простой, просто сделайте два изменения в классическом цикле Javascript for.

var Array = ['a', 'b', 'c'];

for (var i = 1; i <= Array.length; i++) {
  //"i" starts at 1 and ends
  //after it equals "length"
  console.log(i);
}