如何在JavaScript中创建一个索引从1开始的数组?

时间:2010-05-13 12:24:36

标签: javascript arrays indexing

默认情况下,每个JavaScript数组的索引都从0开始。我想创建一个索引从1开始的数组。

我知道,一定非常琐碎......感谢您的帮助。

10 个答案:

答案 0 :(得分:19)

这不是微不足道的。不可能。您可以做的最好的事情是使用从1开始的数字属性创建一个对象,但这不是一回事。

为什么要让它从1开始呢?之一:

  • 从0开始并根据需要调整索引;或

  • 从0开始,只是忽略索引0(即只使用索引1及以上)。

答案 1 :(得分:9)

因为这个问题也出现在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

答案 2 :(得分:5)

一个简单的解决方案是填写第0项:

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


从语义上讲,最好使用一个对象:

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

注意这些键​​实际上不是整数,对象键总是字符串 此外,我们无法使用点符号进行访问。 (MDN - Property Accessors


我选择了第一个解决方案,我觉得这个解决方案不那么令人困惑。

答案 3 :(得分:0)

好的,根据@cletus你不能这样做,因为它是一个内置的javascript功能,但如果你仍然想要那么你可以采用稍微不同的方式。您可以编写自己的与索引相关的Array函数(如reducemapforEach),从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

答案 4 :(得分:0)

您可以使用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]);

如果要确保始终获得第一个true元素,而不管索引如何,并且可以访问ES6,则可以使用:

arr.find(e => e)

答案 5 :(得分:0)

问题询问“如何在 JavaScript 中创建索引从 1 开始的数组”。接受的答案指出“这不是微不足道的。这是不可能的。

这是真的,应该有充分的理由来理解。但是,您可以创建一个数组并省略设置第一个元素,在这种情况下它仍然存在(因此接受的答案是正确的)但它会被标记为空。

let usernames = ['bob', 'sally', 'frank']
let myArray = [];
let arrayIndex = 1;

usernames.map(username => {
    myArray[arrayIndex] = username;
    arrayIndex++;
})

console.log(myArray);
<块引用>

Array(4) [ <1 个空槽>, "bob", "sally", "frank" ]
1:“鲍勃”
2:“莎莉”
3:“坦率”
长度:4

注意长度为“4”。

console.log(myArray[0]);
<块引用>

未定义

使用这个,有一个对我们有利的怪癖,即在数组上使用 Object.keys() 不会返回空(未定义)元素。所以有了上面的数组:

console.log(Object.keys(myArray).length);
<块引用>

3

注意:这可以说是有点hacky,所以请谨慎使用。

由于在我们的世界中很少存在零,因此在您仅要访问预定义索引的情况下,这样做可能很有用。例如,如果您有一本书的页面。没有第 0 页,因为这毫无意义。如果你总是直接访问一个值,例如

const currentPage = pages[1];

那么在我看来这很好,只要代码显示意图。有些人会争辩说,忽略有效的数组索引是徒劳的,我并不完全反对。但是,当我想获取一本书的第 35 页并且数组索引为 34 时,这也是徒劳且非常烦人的。嗯!

当你用 map 循环你的(狡猾的)数组时,它会忽略你不想要的 0 索引:

myArray.map((value, index) => {
    console.log(index);
    console.log(value);
})
<块引用>

1
鲍勃
2
莎莉
3
坦率的

但是,对于一般用途,您应该使用索引 0,这样当您循环一些数据并吐出内容时,您就不会被第一个为空的数据所困扰。

答案 6 :(得分:0)

只需添加一个 null

a = [1, 2, 3, 4]
a.unshift(null)
a[3]    // 3

答案 7 :(得分:-1)

首先将此功能添加到您的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

请参阅live demo

答案 8 :(得分:-2)

我遇到了一个情况,我需要从索引1开始数组。这就是我所做的:

function claimItem($key){
    //remove expiry, decrement quantity available, send Kate & Sasha an email.
    global $con;
    $sql = "SELECT A.name, B.name, C.quantity, B.id FROM invitees A, items B, invitees_items C WHERE C.activation_key = '$key' AND C.items_id = B.id AND C.invitees_id = A.id; SELECT @qnt := quantity, @itm := items_id FROM invitees_items WHERE `activation_key` = '$key'; UPDATE items SET num_available = GREATEST(num_available - @qnt, 0) WHERE id = @itm; UPDATE invitees_items SET expiry = null, activation_key = null WHERE activation_key = '$key';";

    $multiArr = array(array(), array());

    if (mysqli_multi_query($con,$sql)){
      $qcount = 0;
      do
        {
        // Store first result set
        $result=mysqli_store_result($con);
          // Fetch one and one row
          while ($row=mysqli_fetch_row($result))
            {
                array_push($multiArr[$qcount], $row);
            }
          // Free result set
          mysqli_free_result($result);

          $qcount++;
        }
      while (mysqli_next_result($con));
    }
    else {
        return "failure";
    }

    mysqli_close($con); 
    return $multiArr;
}

答案 9 :(得分:-3)

简单,只需对经典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);
}