【问题标题】: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 方法对数组进行了深度比较,测试应该通过了。

标签: javascript arrays loops


【解决方案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 解析仍然很有价值。
猜你喜欢
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
相关资源
最近更新 更多