遍历数组以返回数组的名称
Posted
技术标签:
【中文标题】遍历数组以返回数组的名称【英文标题】:Iterate over an array to return name of array 【发布时间】:2017-01-30 02:17:16 【问题描述】:更新
班级提供的 Chai 测试存在问题。无论如何,感谢您的所有帮助!
我正在为一个班级解决一个问题。它要求我们编写一个名为“each”的函数。它应该为集合的每个元素调用迭代器(值,键,集合)。它应该遍历数组,提供对元素、索引和数组本身的访问。它还应该只遍历数组元素,而不是数组的属性(我遇到的另一个问题)。它还接受数组和对象。
在我正在运行的测试中(在底部),它应该返回:
['ant', 'a', animals],
['bat', 'b', animals],
['cat', 'c', animals]
但是,它正在返回:
['ant', '0', Array[3] [0:"ant", 1:"bat", 2:"cat"]]
...数组中的等等。
如何遍历数组以使其返回列表名称,而不是整个数组本身?
var testeach = function(collection, iterator)
if (Array.isArray(collection))
var len = collection.length;
for (var i in collection)
iterator(collection[i], collection.indexOf(collection[i]), collection);
else
for (var key in collection)
if (collection.hasOwnProperty(key))
iterator(collection[key], key, collection);
;
var animals = ['ant', 'bat', 'cat'];
var iterationInputs = [];
testeach(animals, function(animal, index, list)
iterationInputs.push([animal, index, list]);
);
console.log(iterationInputs);
这是使用 Chai 的测试代码。
describe('each', function()
it('should iterate over arrays, providing access to the element, index, and array itself', function()
var animals = ['ant', 'bat', 'cat'];
var iterationInputs = [];
_.each(animals, function(animal, index, list)
iterationInputs.push([animal, index, list]);
);
expect(iterationInputs).to.eql([
['ant', 0, animals],
['bat', 1, animals],
['cat', 2, animals]
]);
);
【问题讨论】:
确保您正确阅读和理解问题。也许您错误地解释了所需的输出。 “动物”这个词周围没有引号...... 谢谢,内特。我直接从单元测试中提取了所需的输出。它肯定想要输入数组的变量名。在示例中,提供了数组 animals。 啊,好吧,不是找名字,是看数组里面的数组是不是一样。 我的意思是,它不是在寻找字符串“animals”,而是在查看每个数组中的最后一个元素(例如,['ant', 0, **animals**]
)是否具有相同的项目(['ant', 'bat', 'cat']
)在测试中定义(var animals ...
行),它恰好使用与代码中相同的变量名。
换句话说,假设 Chai 的 eql
方法对数组进行了深度比较,测试应该通过了。
【参考方案1】:
就 javascript(可能还有你的班级讲师)而言,Array[3] [0:"ant", 1:"bat", 2:"cat"]
是 animals
。说它们可以互换使用并不完全正确,但就您的作业而言,情况可能就是这样。
您可以将animals
视为指向数组本身的路标 (Array[3] [0:"ant", 1:"bat", 2:"cat"]
)。因此,如果您的作业说它需要animals
,它可能只是被误导,因为作业编写者不想写出整个数组。
【讨论】:
我就是这么想的!但是作业通过使用 Chai 的单元测试检查代码。测试一直失败。它说,expect(iterationInputs).to.eql([ ['ant', 0, animals], ['bat', 1, animals], ['cat', 2, animals] ]); @CarolynCommons 看起来就证明了这一点。它没有说eql([ ['ant', 0, 'animals'], ... ])
。请注意,animals
部分周围没有引号。 animals
在单元测试的上下文中是一个变量,可能指向一个在链上定义的数组。
@JosephMarikle 这很有道理,但测试仍然失败。我提供了上面的测试代码。关于为什么它仍然失败的任何想法?
@CarolynCommons 嗯......现在我仔细观察它,它可能是“索引”部分。你的代码返回'ant', 'a', Array[3] [ ...'
你说。不应该返回'ant', 0, Array[3] [ ...
吗?注意 0
代替 a
糟糕,我刚才打错了。把它固定在上面。确实是在返回 'ant', 0, Array[3] [ ... 不是想迷惑你!【参考方案2】:
你不能这样做。它是一个变量标识符,除非您解析代码并获得abstract syntax tree,否则您无法获得变量名称。
【讨论】:
这里不需要返回字符串"animals"
。
@vlaz 但是 OP 在这个问题上说:如何迭代数组以返回列表名称,而不是完整数组本身?。您从报价中了解到什么?如果您发现问题的其他含义,我可以修正我的答案..
根据针对 OP 中发布的输出运行的单元测试,参数应该是数组本身。这也与 JavaScript 中 forEach
的行为完全一致,其中传递给函数的第三个参数是操作的数组。我完全理解这句话,但很明显这是 OP 提出的 XY 问题。
@vlaz 你是对的。顺便说一句,我不确定是否要放弃整个答案,或者在没有解决方法的情况下将原始答案留在那里......
是的,我认为这很好。虽然它没有为 OP 的问题提供具体答案,但我认为提及 AST 解析仍然很有价值。以上是关于遍历数组以返回数组的名称的主要内容,如果未能解决你的问题,请参考以下文章