Привет, ребята! У меня возник вопрос по 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;
}
});
}
таким образом ты создашь объект, который будет игнорировать все свойства, кроме разрешенных. это гибко и элегантно, хотя может быть немного сложнее для понимания на первый взгляд. но оно того стоит!