【问题标题】:How to create an array in JavaScript whose indexing starts at 1?如何在 JavaScript 中创建一个索引从 1 开始的数组?
【发布时间】:2011-02-19 01:54:46
【问题描述】:

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

我知道,一定很琐碎……谢谢你的帮助。

【问题讨论】:

  • 你为什么要这样做?我问是因为当你发现自己试图规避编程语言的最基本特征之一时,很有可能会有更好的方法来做你想做的事情。
  • 此外,从 0 开始数组索引是一项功能,而不是错误。
  • 如果你想向用户显示索引,你可以只显示 i + 1。你真的应该习惯零索引,因为你一生中会遇到很多围栏错误如果你解决它。
  • 如果您非常想要它,那么您可以创建自己的数据结构。类似singlyLikedList,并修改其方法。
  • 也许 OP 想要检查 index 的值是否存在以执行某些操作。而不是让它从 1 开始,你可以这样做:if(i !== false)

标签: javascript arrays indexing


【解决方案1】:

只需在前面加上null:

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

【讨论】:

    【解决方案2】:

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

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

    let usernames = ['bob', 'sally', 'frank']
    let myArray = [];
    let arrayIndex = 1;
    
    usernames.map(username => {
        myArray[arrayIndex] = username;
        arrayIndex++;
    })
    
    console.log(myArray);
    

    Array(4) [ , "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,因此当您循环一些数据并吐出一些数据时,您不会被第一个为空的数据发现。

    【讨论】:

      【解决方案3】:

      您可以像这样使用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(Boolean)
      

      【讨论】:

        【解决方案4】:

        我遇到了需要数组从索引 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
        
        });
        

        【讨论】:

          【解决方案5】:

          一个简单的解决方案是填充第零项:

          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)


          我会选择第一个解决方案,我认为它不那么令人困惑。

          【讨论】:

            【解决方案6】:

            好的,根据@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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 这不适用于许多数组方法。例如,Array.from(myArray.keys()) 返回 [0, 1, 2, 3, 4] 而不是 [1, 2, 3, 4, 5]
              • @Gothdo,我认为你错了! ‌因为这个结果>>[0, 1, 2, 3, 4]对于@detj(提问者)没有任何意外值。他只需要([0, 1, 2, 3, 4])[n]n&gt;=1。所以这个数组对他来说总是有正确的结果。
              【解决方案8】:

              由于谷歌搜索也会弹出这个问题,比如“javascript start array at 1”,所以我会给出不同的答案:

              数组可以切片。因此,您可以像这样获得 Array 的切片版本:

              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

              【讨论】:

              • 这只是创建一个第一个值为1的数组。这个问题是关于如何创建一个第一个索引为1的数组,这是一个非常不同的事情。
              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                为什么您希望它从 1 开始?要么:

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

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

                【讨论】:

                • 不可能...令人惊讶!好吧,我没有什么有用的理由说...为什么我想从 1 开始...只是一个想法。所以,是的..我想,我必须相应地调整我的指数,这不是问题。想从 1 开始,只是为了它。
                • 现在,8年后,你可以使用Map
                • 如何忽略 Javascript 中的索引 0?
                • @josefdev - 在那里放一个值,然后永远不要引用它。 IE。 a = ["ignore me", "this has index 1", "another string, at index 2"]; firstString = a[1]; 但是,这个建议不是很有用 - 内置函数,如 for (s of a) 不会“知道”你想忽略 a[0] - 负担完全在于你找到不这样做的编码方法' t 使用 a[0];习惯从 0 开始的数组更实用。
                猜你喜欢
                • 2011-08-09
                • 2010-10-10
                • 1970-01-01
                • 2021-12-20
                • 1970-01-01
                • 2015-05-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多