Javascript: невозможно получить значения в объекте с функцией - PullRequest
3 голосов
/ 26 января 2020

Используя Javascript, я написал этот код для создания объекта:

let employee = {
    emp_firstname: "Prasanta",
    emp_lastname: "Banerjee",
    emp_fullname: function(){
        return (this.emp_firstname + " " + this.emp_lastname);
    },
    emp_id: 673630,
    emp_horizontal:"QEA",
    emp_vertical: "Insurance",
    joining_date: "22/12/2017",
    emp_salary : 13579,
    emp_bonus : function(){
        return (this.emp_salary*1);
    }
};

Теперь я заинтересован в печати каждого свойства и его значения, поэтому я написал этот код:

for (let eachEle in employee){
    if(typeof eachEle=='string' || typeof eachEle=='number'){
        console.log(eachEle + ":" + employee[eachEle]);
    }
    else if(typeof eachEle=='function'){
        console.log(eachEle + ":" + employee.eachEle());
    }
}

Но при выполнении все работает нормально, за исключением «emp_fullname» и «emp_bonus». Вместо того, чтобы показать значение, он показывает мне функцию:

let employee = {
  emp_firstname: "Prasanta",
  emp_lastname: "Banerjee",
  emp_fullname: function() {
    return (this.emp_firstname + " " + this.emp_lastname);
  },
  emp_id: 673630,
  emp_horizontal: "QEA",
  emp_vertical: "Insurance",
  joining_date: "22/12/2017",
  emp_salary: 13579,
  emp_bonus: function() {
    return (this.emp_salary * 1);
  }
};

for (let eachEle in employee) {
  if (typeof eachEle == 'string' || typeof eachEle == 'number') {
    console.log(eachEle + ":" + employee[eachEle]);
  } else if (typeof eachEle == 'function') {
    console.log(eachEle + ":" + employee.eachEle());
  }
}

Как я могу получить значение для этих двух свойств? Я ищу ответы, с помощью которых я могу изменить for...in l oop и получить значение.

Ответы [ 5 ]

2 голосов
/ 26 января 2020

Две вещи, которые нужно изменить

  1. Вам необходимо проверить значение элемента для строки, числа и функции, а не клавиши

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

let employee = {
    emp_firstname: "Prasanta",
    emp_lastname: "Banerjee",
    emp_fullname: function(){
        return (this.emp_firstname + " " + this.emp_lastname);
    },
    emp_id: 673630,
    emp_horizontal:"QEA",
    emp_vertical: "Insurance",
    joining_date: "22/12/2017",
    emp_salary : 13579,
    emp_bonus : function(){
        return (this.emp_salary*1);
    }
};

for (let key in employee){
    let eachEle = employee[key];
    if(typeof eachEle=='string' || typeof eachEle=='number'){
        console.log(key + ":" + employee[key]);
    }
    else if(typeof eachEle=='function'){
        console.log(key + ":" + employee[key]());
    }
}
1 голос
/ 26 января 2020

Ваши ошибки: 1. Вы написали: typeof eachEle insted из: typeof employee[eachEle]: 2. Исполнение: employee.eachEle() insted of employee[eachEle](). eachEle - это строка.

let employee = {
    emp_firstname: "Prasanta",
    emp_lastname: "Banerjee",
    emp_fullname: function(){
        return (this.emp_firstname + " " + this.emp_lastname);
    },
    emp_id: 673630,
    emp_horizontal:"QEA",
    emp_vertical: "Insurance",
    joining_date: "22/12/2017",
    emp_salary : 13579,
    emp_bonus : function(){
        return (this.emp_salary*1);
    }
};

    for (let eachEle in employee){debugger
        if(typeof employee[eachEle]=='string' || typeof employee[eachEle]=='number'){
            console.log(eachEle + ":" + employee[eachEle]);
        }
        else if(typeof employee[eachEle]=='function'){
            console.log(eachEle + ":" + employee[eachEle]());
        }
    }
1 голос
/ 26 января 2020

Вам необходимо проверить тип значения, eachEle - это значение ключа, которое для вашего объекта всегда является строкой.

let employee = {
  emp_firstname: "Prasanta",
  emp_lastname: "Banerjee",
  emp_fullname: function() {
    return (this.emp_firstname + " " + this.emp_lastname);
  },
  emp_id: 673630,
  emp_horizontal: "QEA",
  emp_vertical: "Insurance",
  joining_date: "22/12/2017",
  emp_salary: 13579,
  emp_bonus: function() {
    return (this.emp_salary * 1);
  }
};

for (let eachEle in employee) {
  if (typeof employee[eachEle] == 'string' || typeof employee[eachEle] == 'number') {
    console.log(eachEle + ":" + employee[eachEle]);
  } else if (typeof employee[eachEle] == 'function') {
    console.log(eachEle + ":" + employee[eachEle]());
  }
}
1 голос
/ 26 января 2020

Как мне получить значение для этих двух свойств?

Функция равна значению этих свойств. Если вы хотите получить возвращаемое значение функции, вы должны вызвать it.

Обратите внимание, что typeof проверка, которую вы делаете в вашем for-in l oop не нужно Переменная eachEle является свойством name , а не значением свойства. В for-in l oop имя всегда будет строкой. (Не все свойства именуются со строками, но for-in охватывает только те, которые являются.)

Вы хотите получить значение свойства, проверить, является ли оно функцией, и, если это так, вызвать ее:

for (let name in employee){
    let value = employee[name];
    if (typeof value === "function") {
        value = employee[name]();
    }
    console.log(name + ":" + value);
}

Live Пример:

let employee = {
    emp_firstname: "Prasanta",
    emp_lastname: "Banerjee",
    emp_fullname: function(){
        return (this.emp_firstname + " " + this.emp_lastname);
    },
    emp_id: 673630,
    emp_horizontal:"QEA",
    emp_vertical: "Insurance",
    joining_date: "22/12/2017",
    emp_salary : 13579,
    emp_bonus : function(){
        return (this.emp_salary*1);
    }
};
for (let name in employee){
    let value = employee[name];
    if (typeof value === "function") {
        value = employee[name]();
    }
    console.log(name + ":" + value);
}

Вы сказали, что только что захотели изменить l oop, но другой подход заключается в изменении определения объекта для использования свойства аксессора вместо явной функции:

let employee = {
    emp_firstname: "Prasanta",
    emp_lastname: "Banerjee",
    get emp_fullname() {
//  ^^^             ^^
        return (this.emp_firstname + " " + this.emp_lastname);
    },
    emp_id: 673630,
    emp_horizontal:"QEA",
    emp_vertical: "Insurance",
    joining_date: "22/12/2017",
    emp_salary : 13579,
    get emp_bonus() {
//  ^^^          ^^
        return (this.emp_salary*1);
    }
};

Тогда l oop не нужно проверять:

for (let name in employee){
    console.log(name + ":" + employee[name]);
}

Live Пример:

let employee = {
    emp_firstname: "Prasanta",
    emp_lastname: "Banerjee",
    get emp_fullname() {
//  ^^^             ^^
        return (this.emp_firstname + " " + this.emp_lastname);
    },
    emp_id: 673630,
    emp_horizontal:"QEA",
    emp_vertical: "Insurance",
    joining_date: "22/12/2017",
    emp_salary : 13579,
    get emp_bonus() {
//  ^^^          ^^
        return (this.emp_salary*1);
    }
};
for (let name in employee){
    console.log(name + ":" + employee[name]);
}

Это работает, потому что когда вы получаете значение свойства доступа, его функция доступа запускается за сценой, а возвращаемое значение этой функции предоставляется в качестве значения свойства.

0 голосов
/ 26 января 2020

В вашем for l oop вы перебираете ключи в объекте, и они никогда не будут объектами. Вместо этого вы должны извлечь элемент, прежде чем проверять его тип.

for(let key in employee){
    let value = employee[key];
    if(typeof value=='string' || typeof vlaue=='number'){
        console.log(key + ":" + value);
    }
    else if(typeof value=='function'){
        console.log(key + ":" + value());
    }
}
...