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
到 < firstArray.length
,所以如果它与 @ 中的条目数一样多或更多987654325@,您会看到 toRemove
的所有条目(以及 undefined
s,如果 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
循环应该通过 < 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
包含1
、2
或3
。您当前的方法只会删除第一次出现。
我已经修复了代码并让它工作,我将添加到我的主帖子中,但我仍然不确定为什么必须将 [i] 附加到 toRemove 才能工作?
我会看看你的书!很抱歉,OdinProject 很快就超出了我的技能,因为我现在不知所措,哈哈。谢谢,我会继续学习的。以上是关于Fundamentals 4 Odin removeFromArray 语法问题?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle LiveLabs实验:Oracle RAC Fundamentals
Unity3D Odin Inspector 简单介绍与入门
Unity3D Odin Inspector 简单介绍与入门