Посчитать методы и поля объекта

129
04 мая 2019, 14:30

Напишите стрелочную функцию, которая принимает объект, узнаёт сколько у него полей и методов, выводит все поля. И возвращает количество методов.

На данный момент сделал, только вот это:

let data = { 
  name: 'Корегин', 
  age: 18, 
  getHobby: function() { 
    console.log('Корегин - это Будущий Senior-программист'); 
  } 
}; 
 
let properties = 0; 
 
let dataInfo = (dataInfoObject) => { 
  for (var key in data) { 
    properties++ 
    console.log(key); 
  }; 
}; 
 
console.log('Все свойства: '); 
dataInfo(data) 
console.log('Всего свойств: ' + properties);

Мне осталось вывести, только поля и вернуть методы. Какие есть варианты ?

Answer 1

С помощью typeof можно определить тип. Если typeof вернёт function, значит нам попался метод. Иначе - свойство.

let data = { 
  name: 'Корегин', 
  age: 18, 
  getHobby: function() { 
    console.log('Корегин - это Будущий Senior-программист'); 
  } 
}; 
 
 
 
let dataInfo = (dataInfoObject) => { 
  let properties = 0, methods = 0; 
  for (var key in data) { 
    if (typeof data[key] === "function") 
        methods += 1; 
     else properties += 1; 
  }; 
   
  return [properties, methods]; 
}; 
 
console.log('Все свойства: '); 
let res = dataInfo(data); 
console.log('Всего свойств: %d, всего методов: %d', res[0], res[1]);

Если для инстанса класса, то можно вот так (хоть я и не уверен в корректности подхода):

class SomeClass { 
 
	constructor () { 
		this.some = 0; 
    this.test123 = 123; 
   } 
 
	method () { 
		 
  } 
} 
 
let getCount = (classInstance) => { 
  let methods = Object.getOwnPropertyNames(Object.getPrototypeOf(classInstance)).length, 
  properties = Object.keys(classInstance).length; 
  
       
  return [methods, properties] 
   
} 
 
let a = new SomeClass(); 
 
const res = getCount(a);; 
 
console.log('Свойства: %d, методы: %d', res[1], res[0]);

Answer 2

let data = { 
  name: 'Корегин', 
  age: 18, 
  getHobby: function() { 
    console.log('Корегин - это ...'); 
  } 
}; 
 
let dataInfo = (data) => { 
  var res = { properties: [], methods: [] }; 
  for (var key in data) { 
    if (typeof data[key] == "function") { 
      res.methods.push({name: key, value: data[key]}); 
    } else { 
      res.properties.push({name: key, value: data[key]}); 
    } 
  } 
  return res; 
}; 
 
var result = dataInfo(data); 
console.log("Properties:", result.properties.length); 
console.log("Methods:", result.methods.length); 
console.log("All:", result);

Answer 3

var obj = new class { 
  constructor() { 
    this.name = 'Корегин'; 
    this.age = 18; 
  } 
 
  getHobby() { 
    console.log('Корегин - это Будущий Senior-программист'); 
  } 
}; 
 
console.log('Все свойства:', 
  Object.keys(obj) 
); 
 
console.log('Все методы:', 
  Object.getOwnPropertyNames(Object.getPrototypeOf(obj)) 
  .filter(name => name !== "constructor" && typeof obj[name] === "function") 
);

READ ALSO
фильтр объекта за полученным id

фильтр объекта за полученным id

Есть объект с товарами:

149
Bootstrap form select не правильно работает

Bootstrap form select не правильно работает

Почему select не правильно отобразился? Хотя он и там и там один и тот же

187
FormData() input[type=file]

FormData() input[type=file]

https://codepenio/Galtran/pen/BGYRoX?editors=1011

182
В чем разница в объектах? [дубликат]

В чем разница в объектах? [дубликат]

На данный вопрос уже ответили:

131