遍历数组以返回数组的名称

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 解析仍然很有价值。

以上是关于遍历数组以返回数组的名称的主要内容,如果未能解决你的问题,请参考以下文章

返回二维数组子数组联通和最大

以数组编号为变量返回循环内数组的内容

C++ 返回结构数组

使用Java定义数组

如何在反应原生渲染中以无限循环返回数组项视图?

js 数组循环的几种方法及返回值