Fundamentals 4 Odin removeFromArray 语法问题?

Posted

技术标签:

【中文标题】Fundamentals 4 Odin removeFromArray 语法问题?【英文标题】:Fundamentals 4 Odin removeFromArray syntax questions? 【发布时间】:2020-11-04 17:47:23 【问题描述】:
    const removeFromArray = function(firstArray,...toRemove) 
    let modifiedArray = [...firstArray];
    for (i = 0; i < firstArray.length; i++) 
        if (modifiedArray.includes(toRemove[i])) 
            modifiedArray.splice(modifiedArray.indexOf(toRemove[i]), 1)
            
    
    return modifiedArray;

这是一个来自 odin basics 4 的项目,供参考。在试图弄清楚如何做到这一点时,我不小心找到了解决方案。所述函数的目标是输入一个你喜欢的数组,并通过一个带有 2 个参数的函数从所述数组中删除你喜欢的任何东西。即我输入removeFromArray([3,4,5], 3) 会返回[4,5]

问题 1) 为什么需要在 [...firstArray] 周围加上方括号 问题 2)如果 [i] 用于循环您决定为第一个参数(数组)输入多少次迭代,为什么要附加到 (toRemove[i])?

也许我对这实际上是如何工作的有错误的想法?感谢您的帮助,谢谢!

测试:

const removeFromArray = require('./removeFromArray')

describe('removeFromArray', function() 
  it('removes a single value', function() 
    expect(removeFromArray([1, 2, 3, 4], 3)).toEqual([1, 2, 4]);
  );
  it('removes multiple values', function() 
    expect(removeFromArray([1, 2, 3, 4], 3, 2)).toEqual([1, 4]);
  );
  it('ignores non present values', function() 
    expect(removeFromArray([1, 2, 3, 4], 7, "tacos")).toEqual([1, 2, 3, 4]);
  );
  it('ignores non present values, but still works', function() 
    expect(removeFromArray([1, 2, 3, 4], 7, 2)).toEqual([1, 3, 4]);
  );
  it('can remove all values', function() 
    expect(removeFromArray([1, 2, 3, 4], 1, 2, 3, 4)).toEqual([]);
  );
  it('works with strings', function() 
    expect(removeFromArray(["hey", 2, 3, "ho"], "hey", 3)).toEqual([2, "ho"]);
  );
  it('only removes same type', function() 
    expect(removeFromArray([1, 2, 3], "1", 3)).toEqual([1, 2]);
  );
);
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))

【问题讨论】:

【参考方案1】:

问题 1) 为什么需要在 [...firstArray] 周围加上括号

因为没有它们,这是一个语法错误。这种形式的扩展符号仅在数组文字中有效。 (对象具有相同的符号,但含义不同。)... 不是运算符,它是仅在某些地方定义的语法(数组文字、对象文字、解构模式、函数参数列表和函数参数列表) .

问题 2)如果 [i] 用于循环您决定为第一个参数(数组)输入多少次迭代,为什么要附加到 (toRemove[i])?

不应该,这是不正确的。如果数组长于您尝试从中删除的东西的数量,它会起作用,因为您要从 0&lt; firstArray.length ,所以如果它与 @ 中的条目数一样多或更多987654325@,您会看到 toRemove 的所有条目(以及 undefineds,如果 firstArray 更长)。这是该代码不起作用的示例:

const removeFromArray = function(firstArray, ...toRemove) 
  let modifiedArray = [...firstArray];
  for (i = 0; i < firstArray.length; i++) 
    if (modifiedArray.includes(toRemove[i])) 
      modifiedArray.splice(modifiedArray.indexOf(toRemove[i]), 1)
    
  
  return modifiedArray;


console.log(removeFromArray([1, 2], 3, 4, 1)); // Should be [2], is actually [1, 2]

相反,for 循环应该通过 &lt; toRemove.length

该代码的另一个问题是它从不声明i,因此它成为我所说的The Horror of Implicit Globals 的牺牲品。我建议使用严格模式来使其始终应该是错误:

"use strict";
const removeFromArray = function(firstArray, ...toRemove) 
  let modifiedArray = [...firstArray];
  for (i = 0; i < firstArray.length; i++) 
    if (modifiedArray.includes(toRemove[i])) 
      modifiedArray.splice(modifiedArray.indexOf(toRemove[i]), 1)
    
  
  return modifiedArray;


console.log(removeFromArray([1, 2], 3, 4, 1)); // Should be [2], is actually [1, 2]

【讨论】:

编辑 main 以添加测试,感谢您的快速响应! 谢谢,非常感谢。一个人会如何声明我?大多数时候我只看到它在'for'循环中被如此使用,并认为这只是花花公子。只是'让 i = 0' 而不是'i = 0'?这是否意味着我可以毫无后果地移除附着在所有事物上的 [i]?再次感谢 T.J.! @JamesRoss - 是的,let(或var,如果您必须支持过时的环境)。你仍然需要[] 周围的i。但是您可能会考虑使用for-of 循环而不是for 循环:for (const value of toRemove) let index = firstArray.indexOf(value); if (index !== -1) firstArray.splice(index, 1); (您可以在我的新书中了解for-of 循环;我的个人资料中的链接。)可能还值得询问您想做什么如果firstArray[1, 2, 3, 1, 2, 3] 并且toRemove 包含123。您当前的方法只会删除第一次出现。 我已经修复了代码并让它工作,我将添加到我的主帖子中,但我仍然不确定为什么必须将 [i] 附加到 toRemove 才能工作? 我会看看你的书!很抱歉,OdinProject 很快就超出了我的技能,因为我现在不知所措,哈哈。谢谢,我会继续学习的。

以上是关于Fundamentals 4 Odin removeFromArray 语法问题?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle LiveLabs实验:Oracle RAC Fundamentals

SQL Fundamentals: 子查询 || 分析函数

Unity3D Odin Inspector 简单介绍与入门

Unity3D Odin Inspector 简单介绍与入门

Unity3D Editor Undo回退效果实现3 Odin相关

Unity3D Editor Undo回退效果实现3 Odin相关