Как создать объект JavaScript только с переданными свойствами?

Привет, ребята! У меня возник вопрос по JavaScript. Я хочу создать объект, который принимает только определенные поля. Например, если у меня есть объект User, я хочу, чтобы он принимал только id и name, даже если передать ему другие свойства.

Вот пример кода, который я пытаюсь реализовать:

function Пользователь(параметры) {
  if (параметры) {
    this.идентификатор = параметры.идентификатор;
    this.имя = параметры.имя;
  }
}

let данные = {
  идентификатор: 456,
  случайное: 'что-то'
};

let пользователь = new Пользователь(данные);
console.log(JSON.stringify(пользователь)); // Должно вывести: { идентификатор: 456 }

Как это сделать наиболее эффективно? Не хочется писать условие для каждого свойства. Может, есть какой-нибудь более умный способ? Буду благодарен за любые идеи!

Можно использовать деструктуризацию объекта и создать новый объект только с нужными свойствами:

function Пользователь({ идентификатор, имя }) {
  return { идентификатор, имя };
}

Так мы получим объект только с указанными полями, даже если в параметрах будут лишние. Просто, но эффективно! А как вы обычно решаете такие задачи?

Вот еще один вариант - использовать Object.fromEntries и Object.entries:

function Пользователь(параметры) {
  const разрешенные = ['идентификатор', 'имя'];
  return Object.fromEntries(
    Object.entries(параметры).filter(([key]) => разрешенные.includes(key))
  );
}

Этот подход более гибкий, т.к. можно легко менять список разрешенных свойств. Плюс он работает с любым количеством параметров без изменения кода функции. Производительность может быть чуть ниже, но для большинства случаев разница незаметна.

знаешь, я недавно столкнулся с похожей задачей. попробуй использовать прокси-объект - это мощная штука! вот примерчик:

const allowedProps = ['идентификатор', 'имя'];

function Пользователь(параметры) {
  return new Proxy({}, {
    set(target, prop, value) {
      if (allowedProps.includes(prop)) {
        target[prop] = value;
      }
      return true;
    }
  });
}

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