Выполняя некоторые проблемы с freecodecamp, я столкнулся с небольшой проблемой с направлением значений объекта [дубликат]

avatar
Savior-code
9 августа 2021 в 02:18
53
1
1

Код просто возвращает то, что в первом аргументе соответствует второму аргументу, и проверяется. ссылка на всякий случай

В основном я фокусируюсь на "source[srcKeys[i]]" в операторе if. Только "srcKeys" возвращает "['last']", но если вы добавите перед ним "source", например "source[srcKeys]", вы получите "Capulet". Мой вопрос: почему он возвращает «Капулет», а не «['последний']», поскольку он нацелен на Object.keys, а не на значение?

    function whatIsInAName(collection, source) {
  var srcKeys = Object.keys(source);



  return collection.filter((obj) => {

    for (var i = 0; i < srcKeys.length; i++) {
      if (obj[srcKeys[i]] !== source[srcKeys[i]]) {
        return false
      }
    }
    return true;
  });
}

whatIsInAName(
  [
    { first: "Romeo", last: "Montague" },
    { first: "Mercutio", last: null },
    { first: "Tybalt", last: "Capulet" }
  ],
  { last: "Capulet" }
);
Источник

Ответы (1)

avatar
smac89
9 августа 2021 в 02:48
0

но если вы добавите перед ним "источник", например "source[srcKeys]", вы получите "Capulet"

Вы действительно пробовали это?

Похоже, вы говорите, что выражение source[['last']] будет оцениваться как Capulet.

Давайте попробуем:

const collection = [{
    first: "Romeo",
    last: "Montague"
  },
  {
    first: "Mercutio",
    last: null
  },
  {
    first: "Tybalt",
    last: "Capulet"
  }
];

const source = {
  last: "Capulet"
};

const srcKeys = Object.keys(source);

console.log(source[srcKeys]);

Ну, я буду... еще одной жемчужиной Javascript! Замечательно!

Здесь драконы

Хорошо, похоже, что JavaScript позволяет вам индексировать массив, используя массив из одного элемента в качестве индекса, и это будет работать.

Единственное, что я смог найти в Интернете, объясняющее это, это сообщение в блоге.

Далее в сообщении показано, что даже при выполнении чего-то вроде:

source[[[[srcKeys]]]]

Также даст результат Capulet.

Как замечательно!

Мораль этой истории такова: у Javascript много особенностей, которые сразу не бросаются в глаза. Я бы назвал их неопределенными, но Javascript кажется довольно последовательным в причудливом отделе. Вот почему многие разработчики обращаются к другим языкам, которые компилируются в Javascript, просто чтобы избежать этих скрытых ошибок.


Мой вопрос: почему возвращается "Капулетти", а не "['последний']"

Ну, в этом случае, он не не должен возвращать/оценивать значение ['last'], если у вас нет значения в source, который представляет собой список, содержащий только 'last'. Кто знает, может быть, существует еще одна скрытая особенность JavaScript, которая может возвращать ['last']. Насколько я знаю, это невозможно, но раньше я ошибался...