Является ли использование undefined в качестве значения в определении объекта хорошей практикой? - PullRequest
0 голосов
/ 14 октября 2019

tl; dr: Является ли хорошей практикой использование undefined в качестве значения или мне следует избегать его и попробовать другой подход?

У меня есть объект, который я использую в качестве схемы для двух своих функций createUser() и updateUser(), и в зависимости от того, какие значения мне нужны, я перенастраиваю его.

Для updateUser() IМне нужно отправлять только те ключи, которые пользователь ввел в форму, так что единственный способ, который я знаю, без изменения структуры объекта вручную, это установить значения undefined.

// d is passed as argument

const args = {
  variables: {
    where: {id: "someValue"},
    data: {
      username: d.username || undefined,
      password: d.password || undefined,
      role: d.role || undefined,
    },
  },
};

Теперь, если я ввел только username, мой объект будет

variables: {
  where: { id: "someValue"}, 
  data: { username: "anotherValue" }
}

Я подумала об этом еще раз, после того как ESLint дал мне предупреждение "Unexpected use of undefined."

ПРИМЕЧАНИЕ Я не могу отправить пустые значения в API. Он должен иметь либо значение, либо не отправлять ключ вообще.

Ответы [ 4 ]

2 голосов
/ 14 октября 2019
const args = {
  variables: {
    where: {id: "someValue"},
    data: {
      username: d.username || "",
      password: d.password || "",
      role: d.role || "",
    },
  },
};

Имеет больше смысла использовать пустые значения вместо того, чтобы оставлять их неопределенными, или вы можете использовать null.

So, that your API contracts won't get violated.
1 голос
/ 14 октября 2019

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

Очень простой и короткий ответ навопрос: да. undefined является допустимым значением, и если это будет явно плохой практикой, то язык не позволит присвоить это значение. Однако важно убедиться, что вы не дублируете свои значения. Взглянув на этот объект

{
  variables: {
    where: {id: "someValue"},
    data: {
      username: d.username || undefined,
      password: d.password || undefined,
      role: d.role || undefined,
    },
  },
};

, мы увидим, что вы повторяете одну и ту же идею снова и снова. Вместо этого вам лучше реализовать что-то вроде этого:

function nicify(object) {
    for (var key in object) {
        if (!object[key]) object[key] = undefined;
        else if ((typeof(object[key]) === "object") || (Array.isArray(object[key]))) {
            nicify(object[key]);
        }
    }
}

function выше рекурсивно делает то, что вы хотели сделать с вашими атрибутами. Это будет очень полезно, если у вас много атрибутов и / или много вариантов использования. Кроме того, если у вас постоянно есть шаблон наличия исходного объекта, как в вашем примере, тогда вы можете реализовать что-то вроде этого:

function fillBySource(object, source) {
    for (var key in source) {
        object[key] = source[key] || undefined;
    }
}
1 голос
/ 14 октября 2019

Я думаю, || null или || '' - лучшая практика, если вы JSON.stringify() обмениваетесь данными с сервером или что-то в JSON ничего не говорит вам, что username и password должны присутствовать вdata проп. Вы можете видеть это в следующем примере:

function test(username, password, role) {
  const args = {
    variables: {
      where: {id: "someValue"},
      data: {
        username: username || undefined,
        password: password || undefined,
        role: role || undefined,
      },
    },
  };
  return JSON.stringify(args);
}

let json = test();

console.log(json);
0 голосов
/ 14 октября 2019

Насколько мне известно, вы не должны назначать неопределенным способ, которым вы в настоящее время делаете это, потому что, если d.username в коде не установлен, то его значение уже не определено.

...