从最后索引数组

时间:2017-05-14 11:58:08

标签: javascript arrays indexing

我正在学习Javascript,而且我来自Python背景。 因此,尝试从末尾索引array,即使用负索引,对我来说是相当直观的。
从我到目前为止所读到的内容来看,Javascript并不支持它们。 但是,我找到了一些看似有趣的东西,但我无法理解这背后的原因。

todos = ['item1', 'item2', 'item3']

function updateTodos(index, new_value) {
    todos[index] = new_value
    console.log(todos)
}

function deleteTodos(index) {
    todos.splice(index)
    console.log(todos)
}

deleteTodos(-1)    
updateTodos(-1, 'new_item')
deleteTodos(-1)

输出

["item1", "item2"]
["item1", "item2", -1: "new_item"]
["item1", -1: "new_item"]

问:deleteTodos为什么updateTodos能够删除正确的索引?

问:我如何适应updateTodos中负面索引的这种行为以及一般处理array数据结构的任何函数?

据我所知,updateTodos中的索引查找index变量并更新该索引处的值(如果存在),否则会创建一个键值对。 splice方法支持否定索引,不是吗?

如果您能澄清我的推理和/或帮助我提供有用的资源以更好地理解这个概念,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

根据MDN,splice确实支持负索引。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

  

开始更改数组的索引(原点为0)。如果更大   比数组的长度,实际的起始索引将被设置为   数组的长度。如果否定,将从那里开始那么多元素   数组的结尾(原点1)。

所以,这就是删除作品的原因。

要在更新中启用否定索引,您可以检查提供的参数是否为负数。如果是,则使用array.length + index进行类似python的索引是一种简单的方式。

答案 1 :(得分:0)

要添加到接受的答案中的两件事:

1)请记住,当使用splice时,如果您没有指定要删除的项目数量(第二个参数),那么将从您指定的索引到数组末尾的所有内容都将被删除。从你的问题我怀疑这是你想要的。

2)Splice也可用于向数组添加元素(第三个参数,第四个参数等),因此可以正常使用更新函数。

解决这两个问题的完整示例如下:

function updateTodos(index, new_value) {
  todos.splice(index, 1, new_value);
}

function deleteTodos(index) {
  todos.splice(index, 1);
}

你可以变得更加漂亮,并将它们组合成一个函数,如果你指定一个值然后更新,否则它会被删除,但它可能是不必要的。