Как создать массив в JavaScript, индексирование которого начинается с 1? - PullRequest
18 голосов
/ 13 мая 2010

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

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

Ответы [ 8 ]

19 голосов
/ 13 мая 2010

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

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

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

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

9 голосов
/ 21 сентября 2015

Так как этот вопрос также всплывает для поиска в Google, например, "javascript start array at 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

5 голосов
/ 16 марта 2014

Простым решением является заполнение нулевого элемента:

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


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

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

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


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

0 голосов
/ 16 мая 2019

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

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

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

Или просто не определять его вообще:

let arr = [,'b','c'];

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

Если вы хотите убедиться, что вы всегда получаете первый истинный элемент независимо от индекса и имеете доступ к ES6, вы можете использовать:

arr.find(e => e)
0 голосов
/ 04 июня 2018

Я столкнулся с ситуацией, когда мне нужен массив для запуска с индекса 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

});
0 голосов
/ 22 мая 2018

Хорошо, согласно @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

0 голосов
/ 13 ноября 2016

Сначала добавьте эту функцию в ваши коды 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

См. живое демо

0 голосов
/ 26 января 2015

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