Итерирование и перечисление массива без получения одинаковых результатов - PullRequest
0 голосов
/ 29 августа 2018

Я должен пройти тест по этой строке кода и после прочтения различных постов о том, чтобы убедиться, что я выполняю итерацию массива, а не перечислять, чтобы попытаться избежать возможных сложностей с цепочкой прототипов и т. Д. (Если честно, я не понимаю все как бы там ни было).

У меня есть два фрагмента кода, которые, кажется, делают одно и то же, только один перечисляет, а другой итерирует. Тем не менее, часть, которая заставляет меня выдергивать волосы, состоит в том, что если я перечисляю, то я прохожу все тесты, но если я повторяю, тогда я не делаю, я проваливаю часть, которая говорит: «следует скопировать свойства из источника в место назначения»

Вот итерация:

function copy(destination, source){
var index;
for (index = 0; index <= source.length; index++) {
  if (source.propertyIsEnumerable(index) && destination[index] === undefined) {
    destination[index] = source[index];
  }
}
return destination;

Я передаю второй аргумент в функции с именем «source» первой функции с именем «destination».

теперь, когда я добавляю код перечисления, я прохожу все тесты:

function copy(destination, source){
var index;
for (var index in source) {
  if (source.propertyIsEnumerable(index) && destination[index] === undefined)
    destination[index] = source[index];
}
return destination;
};

Теперь я полагаю, что они делают то же самое, однако может показаться, что это не так?

1 Ответ

0 голосов
/ 29 августа 2018

Итерационная версия не работает на примере, подобном этому. Обе версии копируют проиндексированные элементы, но только версия перечисления копирует именованные свойства объекта массива.

var oldArray = [1, 2, , 4];
oldArray.someProp = "foo";

var newArray1 = copyArrayIter(oldArray);
console.log(newArray1);
console.log(newArray1.someProp);

var newArray2 = copyArrayEnum(oldArray);
console.log(newArray2);
console.log(newArray2.someProp);

function copyArrayIter(source) {
  var index;
  var destination = [];
  for (index = 0; index <= source.length; index++) {
    if (source.propertyIsEnumerable(index) && destination[index] === undefined) {
      destination[index] = source[index];
    }
  }
  return destination;
}

function copyArrayEnum(source) {
  var index;
  var destination = [];
  for (var index in source) {
    if (source.propertyIsEnumerable(index) && destination[index] === undefined)
      destination[index] = source[index];
  }
  return destination;
};

Он будет копировать элементы с индексами 0, 1 и 3, но не будет копировать свойство someProp.

...