繁体   English   中英

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

[英]How to create an array in JavaScript whose indexing starts at 1?

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

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

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

为什么你希望它从 1 开始? 任何一个:

  • 从 0 开始并根据需要调整您的指数; 或者

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

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

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


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

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

请注意,这些键实际上不是整数,对象键始终是字符串。
此外,我们不能使用点表示法进行访问。 MDN - 属性访问器


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

由于这个问题也会在 Google 搜索中弹出,例如“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

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

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

代码笔: https ://codepen.io/anon/pen/rvbNZR ? editors = 0012

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

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

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,因此当您循环一些数据并吐出内容时,您不会被第一个为空的数据所困扰。

只需添加一个null

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

使用Array.map

[,1,2,3].map((v, i) => ++i)

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

观看现场演示

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

});

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM