Предупреждение о необработанном Promiserejectionwarning: ошибка типа: не удается прочитать параметр свойства неопределенного

#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
});