默认情况下,每个JavaScript数组的索引都从0开始。我想创建一个索引从1开始的数组。
我知道,一定非常琐碎......感谢您的帮助。
答案 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函数(如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"]
答案 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);
}