#javascript #methods
#javascript #методы
Вопрос:
Итак, что я пытаюсь сделать, это создать метод класса, который сравнивает два объекта и возвращает пользовательские данные в зависимости от результатов. Чтобы получить эти пользовательские данные, у меня есть деструктурированные параметры, которые должны позволить мне настроить, какие данные он возвращает. Вот пока код для справки:
objects(obj1, obj2, { keysAndValues = true, returnSimplified = false, returnDetailed = false, keysOnly = false, valuesOnly = false }) {
try {
var results = [];
if (keysOnly == true) {
if (valuesOnly == true || keysAndValues == true) {
throw new SyntaxError('Two conflicting arguments cannot be chosen.');
}
Object.keys(obj1).forEach(o1 => Object.keys(obj2).forEach(o2 => {
if (o1 == o2) results.push(o1);
}));
} else if (valuesOnly == true) {
if (keysOnly == true || keysAndValues == true) {
throw new SyntaxError('Two conflicting arguments cannot be chosen.');
}
Object.values(obj1).forEach(o1 => Object.values(obj2).forEach(o2 => {
if (o1 == o2) results.push(o1);
}));
} else if (keysAndValues == true) {
if (valuesOnly == true || keysOnly == true) throw new SyntaxError('Two conflicting arguments cannot be chosen.');
results.push('Keys: ')
Object.keys(obj1).forEach(o1 => Object.keys(obj2).forEach(o2 => {
if (o1 == o2) results.push(o1);
}));
results.push('Values: ')
Object.values(obj1).forEach(o1 => Object.values(obj2).forEach(o2 => {
if (o1 == o2) results.push(o1);
}));
} else if (returnSimplified == true amp;amp; returnDetailed == true) throw new SyntaxError('Two conflicting arguments cannot be chosen.');
var details = {
NumberOfMatchingResults: results.length,
ObjectName1: obj1,
ObjectName2: obj2,
ObjectKeys1: Object.keys(obj1),
ObjectKeys2: Object.keys(obj2),
ObjectValues1: Object.values(obj1),
ObjectValues2: Object.values(obj2)
};
return ((returnSimplified == true amp;amp; !returnDetailed == true) ? results.length : (returnDetailed == true) ? details : results);
} catch (error) {
console.log(error.stack);
}
}
Это не самый красивый фрагмент кода, но по большей части он выполняет свою работу. Проблема возникает, когда я пытаюсь вызвать метод без одного из деструктурированных параметров.
Пример:
console.log(Compare.objects(obj1, obj2)); //returns 'Cannot read property "keysAndValues" of undefined'
Я не знаю, что еще попробовать, потому что пока ничего не сработало, поэтому я вместо этого задаю вопрос здесь. Любая помощь была бы замечательной.
Ответ №1:
Проблема в том, что вам нужно установить значение по умолчанию для самого вашего деструктурированного параметра. Просто установите его значение по умолчанию как пустой объект, чтобы достичь желаемого результата.
objects(obj1, obj2, {
keysAndValues = true,
returnSimplified = false,
returnDetailed = false,
keysOnly = false,
valuesOnly = false } = {}
) {
// method code here
}
Вы можете дополнительно очистить свой метод, исключив операторы равенства при проверке истинных или ложных значений. if (valuesOnly)
предпочтительнее, чем if (valuesOnly == true)
.
Кроме того, при сравнении не булевых значений всегда следует использовать операторы строгого равенства, чтобы избежать ошибок. Так (o1 == o2)
и должно быть (o1 === o2)
Комментарии:
1. Спасибо! Большую часть этого кода я написал в 4 часа ночи прошлой ночью, поэтому я знаю, что это не самое лучшее, но да, это решает проблему!
2. Нет проблем, было раньше
![]()
Ответ №2:
Определите свой третий параметр следующим образом:
objects(obj1, obj2, booleans = {}) {
const {
keysAndValues = true, // default value
returnSimplified = false, // default value
returnDetailed = false, // default value
keysOnly = false, // default value
valuesOnly = false, // default value
} = booleans;
..... // block of code
}
во время вызова метода сделайте это:
// without third param
Compare.objects(obj1, obj2)
// with third param
Compare.objects(obj1, obj2, {
keysAndValues : true, // or false
returnSimplified : false, // or true
returnDetailed : false, // or true
keysOnly : false, // or true
valuesOnly : false, // or true
});