2016-09-21 5 views
2

UPDATEперебрать массив вернуть имя массива

Существовал проблема с тестом Chai, что класс при условии. Спасибо всем за вашу помощь!

Я работаю над проблемой для класса. Он просит написать функцию «каждый». Он должен вызывать 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] 
     ]); 
     }); 
+0

Убедитесь, что вы правильно читаете и понимаете проблему. Возможно, ваш перевод неверно. Слово «животные» не содержит строковых котировок вокруг него ... – Nate

+0

Спасибо, Нейт. Я вытащил желаемый результат непосредственно из модульного теста. Он определенно хочет имя переменной входного массива. В этом примере представлены животные массива. –

+0

Просьба представить код для теста, если вы хотите узнать, почему ваш код не прошел тест. –

ответ

4

Вы не можете сделать этого. Это идентификатор переменной, и вы не можете получить имя переменной, если вы не разобрали код, и вы получите abstract syntax tree.

+0

Возвращение строки '" animals "' не является тем, что здесь необходимо. – vlaz

+0

@vlaz Но OP сказал на вопрос: ** Как перебирать массив так, чтобы он возвращал имя списка, а не полный массив? **. Что вы понимаете из цитаты? Я могу исправить свой ответ, если вы найдете другое значение для вопроса. –

+0

В соответствии с модульными тестами, запущенными с выходом, опубликованным в OP, параметр должен быть самим массивом. Это также полностью соответствует поведению 'forEach' в JavaScript, где третьим параметром, переданным функции, является работающий массив. Я полностью понимаю цитату, но очень очевидно, что это была проблема XY, которую поставил ОП. – vlaz

4

Что касается JavaScript (и, возможно, вашего инструктора по классу), то Array[3] [0:"ant", 1:"bat", 2:"cat"]являетсяanimals. Не совсем правильно сказать, что их можно использовать взаимозаменяемо, но для целей вашего назначения это, вероятно, так.

Вы можете думать о animals как указатель, указывающий на массив (Array[3] [0:"ant", 1:"bat", 2:"cat"]). Поэтому, если ваше задание говорит, что он хочет animals, его может просто ввести в заблуждение, потому что автор присваивания не захотел выписать весь массив.

+0

Вот что я думал! Но назначение проверяет код посредством модульного теста с использованием Chai. Тест продолжает терпеть неудачу. Он говорит, что ожидать (iterationInputs) .to.eql ([ ['ant', 0, animals], ['bat', 1, animals], ['cat', 2, animals] ]); –

+0

@CarolynCommons Похоже, это просто доказывает это. Он не говорит 'eql ([['ant', 0, 'animals'], ...])'. Обратите внимание, что в части «животных» нет кавычек. «животные» в контексте единичного теста - это переменная, вероятно, указывая на массив, который определен высоко над цепочкой. –

+0

@JosephMarikle Это имеет смысл, но тест все еще терпит неудачу. Я представил тестовый код выше. Любые мысли о том, почему он все еще не работает? –