【问题标题】:Indexing an array from the end从末尾索引数组
【发布时间】:2017-05-14 11:58:08
【问题描述】:

我正在学习 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 方法支持负索引,不是吗?

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

【问题讨论】:

    标签: javascript arrays indexing


    【解决方案1】:

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

    开始更改数组的索引(原点为 0)。如果更大 比数组的长度,实际的起始索引将设置为 数组的长度。如果为负数,将从 数组的末尾(原点为 1)。

    所以,这就是删除有效的原因。

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

    【讨论】:

    • 谢谢。我的临时解决方案是检查索引是否为负并应用您在上面编写的公式,但我正在寻找可以执行更新的内置功能。有吗?
    • 据我所知,没有用于反向索引数组的内置功能。
    【解决方案2】:

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

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

    2) Splice 还可用于向数组添加元素(第三个参数、第四个参数等),因此可以很好地用于您的更新函数。

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

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

    您还可以更花哨,将它们组合成一个函数,如果您指定一个值,则该函数会更新,否则会被删除,但这可能是不必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-15
      • 2020-01-06
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多