Неизвестное поведение Object.values ​​() в функции стрелки - PullRequest
0 голосов
/ 12 апреля 2020

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

function generatePassword(lower, upper, number, symbol, length) {
  let generatedPassword = "";
  const typesCount = lower + upper + number + symbol;
  const typesArr = [{ lower }, { upper }, { number }, { symbol }].filter(
    (item) => Object.values(item)[0]
  );

  // Doesn't have a selected type
  if (typesCount === 0) {
    return "";
  }

  // create a loop
  for (let i = 0; i < length; i += typesCount) {
    typesArr.forEach((type) => {
      const funcName = Object.keys(type)[0];
      generatedPassword += randomFunc[funcName]();
    });
  }

  const finalPassword = generatedPassword.slice(0, length);

  return finalPassword;
}

В этом блоке кода конкретно Object.values (item) [0] не работает, если я заключаю заявление в фигурные скобки {}:

const typesArr = [{ lower }, { upper }, { number }, { symbol }].filter(
    (item) => Object.values(item)[0]
  );

Я не понимаю, почему это происходит, я пытался искать документы, но безрезультатно Спасибо!

1 Ответ

1 голос
/ 12 апреля 2020

Для правильной работы функции фильтра ее необходимо вернуть. правда ложной ценности.

Когда вы пишете это как

const typesArr = [{ lower }, { upper }, { number }, { symbol }].filter(
    (item) => Object.values(item)[0]
  );

Результат неявно возвращает ie. Object.values ​​(item) [0] - это возвращаемое значение

Однако, если вы напишите его как

const typesArr = [{ lower }, { upper }, { number }, { symbol }].filter(
    (item) => { Object.values(item)[0] }
  ); 

Вы не вернули никакого значения из функции фильтра, вам потребуется добавить для него оператор возврата, например

const typesArr = [{ lower }, { upper }, { number }, { symbol }].filter(
    (item) => { return Object.values(item)[0]; }
);
...