迭代数组以返回数组的名称

时间:2016-09-21 17:40:53

标签: javascript arrays loops

更新

班级提供的Chai测试存在问题。非常感谢您的帮助!

我正在为一个班级解决问题。它要求我们编写一个名为“each”的函数。它应该为集合的每个元素调用iterator(value,key,collection)。它应该遍历数组,提供对元素,索引和数组本身的访问。它也应该只迭代数组元素,而不是数组的属性(我遇到的另一个问题)。它还接受数组和对象。

在我正在运行的测试中(在底部),它应该返回:

['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]
        ]);
      });

2 个答案:

答案 0 :(得分:4)

你不能这样做。它是一个变量标识符,除非您解析代码并获得abstract syntax tree,否则无法获取变量名称。

答案 1 :(得分:4)

就JavaScript(可能还有您的班级讲师)而言,Array[3] [0:"ant", 1:"bat", 2:"cat"] animals。说它们可以互换使用并不完全正确,但就你的任务而言,可能就是这种情况。

您可以将animals视为指向数组本身的路标(Array[3] [0:"ant", 1:"bat", 2:"cat"])。因此,如果你的任务表明它想要animals,那么可能只会被误导,因为作业编写者不想写出整个数组。