【问题标题】:What is the [i] doing in this function?[i] 在这个函数中做了什么?
【发布时间】:2020-11-04 20:27:21
【问题描述】:
const removeFromArray = function(firstArray,...toRemove) {
    let modifiedArray = [...firstArray];
    for (let i = 0; i < toRemove.length; i++) {
        if (modifiedArray.includes(toRemove[i])) {
            modifiedArray.splice(modifiedArray.indexOf(toRemove[i]), 1)
        }    
    }
    return modifiedArray;
};
console.log(removeFromArray([3,4,5], 3,5)) ; //result is [4]

目标:将任何数组作为第一个参数,并从所述数组中删除您想要的任何内容作为下一个参数。

抱歉,这让我无法入睡,但 [i] 在做什么附加 toRemove

假设我想做removeFromArray(['a','b','c'], 'b');

这意味着toRemove 等于'b'。 toRemove 的长度为 1。所以循环说运行一次迭代,因为 toRemove 只有 1 个长度。

至此,我想我明白了。我不明白为什么(modifiedArray.includes(toRemove[i])) 因为那不只是意味着(modifiedArray.includes('b'[1])) 吗?

如果你喜欢removeFromArray(['a','b','c'], 'a', 'c'); [i] 是否意味着toRemove 将被迭代两次,每次迭代一次,所以对于第二次迭代,其值为 2?

(modifiedArray.includes(['a', 'c'][1]))
(modifiedArray.includes(['a' ,'c'][2]))

还是这样

(modifiedArray.includes(['a' ,'c'][1]))
(modifiedArray.includes(['a' ,'c'][1]))

我希望我能够解释我的困惑我有点沮丧。谢谢!

【问题讨论】:

标签: javascript arrays function loops arguments


【解决方案1】:

这仅仅是因为rest parameter

来自 MDN 文档

其余参数语法允许我们表示一个不定数 参数作为一个数组。

因此,在您的示例中,您传递给 removeFromArrayfunction (3,5) 的参数成为一个名为 toRemove 的数组,并且为了访问您必须执行 remove[i] 的值。

这里有一个例子可以帮助你澄清

const removeFromArray = function(a, b) {
  console.log(a)
  console.log(b)
}
removeFromArray(1, 3)

添加 spread operator 并将值作为单个 argument 传递

 const removeFromArray = function(...toRemove){
  console.log(toRemove)
}
  removeFromArray(1,3)

【讨论】:

  • 我现在更好地理解了rest参数,但是为什么不能在没有附加[i]的情况下在for循环中访问它们的值?
  • 因为这是从数组中访问值的唯一方法,您将如何访问数组中的值?
  • 你也可以使用for ..of循环来遍历一个数组。
  • @slooo7 在 OP 的例子中已经有一个 for 循环
  • "...当函数运行时 [i] 有什么值?" - 如果你不知道 for 循环是如何工作的,那么你真的应该查看它的文档(例如here)或获取有关如何使用数组的教程
【解决方案2】:

const removeFromArray = function (firstArray, ...toRemove) {

首先阅读Rest parameters

firstArray 将是您传递给此函数的第一个参数。

...toRemove 将参数的其余部分作为一个数组。

如果你这样调用函数removeFromArray([1,3,4], 4,5,6,7)

firstArray 将等于 [1, 3, 4]

toRemove 将等于 [4, 5, 6, 7]

let modifiedArray = [...firstArray]; // 这将创建firstArray 的副本并将其存储在modifiedArray 中。

for (let i = 0; i &lt; toRemove.length; i++) {

这将循环遍历值为 [4, 5, 6, 7] 的 toRemove 数组

if (modifiedArray.includes(toRemove[i])) {

在第一次迭代中,它将检查toRemove[0]4 是否存在于modifiedArray 中,如果存在,它将从下一行的modifiedArray 中删除该元素。 在第二次迭代中,它将检查toRemove[1]5 并将其从modifiedArray 中删除,同样,它将继续从modifiedArray 中删除toRemove 中存在的所有元素。

modifiedArray.splice(modifiedArray.indexOf(toRemove[i]), 1);

最后,它将从modifiedArray 中删除数组toRemove 包含的所有元素,modifiedArrayfirstArray 的副本并返回它。

【讨论】:

  • 你是圣人,谢谢。我一直以一种方式思考它,但我现在看到正在发生的事情,并且会睡得更开心。
【解决方案3】:

toRemove.length确定循环次数,toremove中的每个值都执行一次。

还有一点很重要,indexOf 只显示第一个查找对象的index。因此,如果数组中有多个相同的数字,则不会被删除。

['a','b','b'].indexOf('b')

我英语不好。我只能和你说这么多。

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多