Как сделать цикл for in с hasOwnProperty функцией
Я хочу сделать функцию, который мы передадим объект и функцию, которая пройдётся по всем элементам массива и сделает if (object.hasOwnProperty(key)), но не получается
Возможно в языке уже есть подобный перебор, но я не знаю как он называется
const person = Object.create({
calculateAge() {
console.log(this.age);
}
}, {
name: {
value: 'Misha',
enumerable: true,
writable: false,
configurable: false
},
birthYear: {
value: 1993,
enumerable: true,
writable: false,
configurable: false
},
age: {
get() {
return new Date().getFullYear() - this.birthYear;
},
set(value) {
console.log('Set age', value + ', this age:', this.age);
}
}
});
for (let key in person) {
if (person.hasOwnProperty(key)) {
console.log(key, person[key], person.age);
}
} // Как я хочу, чтобы работало
function forInHasOwnProperty(key, object, code) {
for (let key in object) {
if (object.hasOwnProperty(key)) {
code();
}
}
}
forInHasOwnProperty('key', person, function() {
console.log('key', person['key'], person.age);;
});
Ответы (2 шт):
Ну функция же должна как-то узнать, что выводить)
Вы пытаетесь найти ключ по СТРОКЕ "key" - а её там нет.
const person = Object.create(
{ // __proto__
bubu: {
value: 1000,
enumerable: false,
},
},
{ // own properties
a: { value: 1, enumerable: true },
b: { value: 2, enumerable: true },
c: { value: 3, enumerable: true },
age: { value: 10 }
}
);
console.log( person.__proto__.bubu === person.bubu ); //* true
forInHasOwnProperty(person, log);
function log(obj, key) {
console.log(key, obj[key], obj.age);
}
/***/
function forInHasOwnProperty(obj, callback) {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
callback(obj, key); // Отдаем аргументы на обработку
} else {
console.log("Not own: " + key);
}
}
}
Возможно в языке уже есть подобный перебор
Object.keys() / - - / Object.values() / - - / Object.entries()
Все они смотрят только на свойства самого объекта.
const person = Object.create(
{
bubu: {
value: 1000,
enumerable: false,
},
},
{
a: { value: 1, enumerable: true },
b: { value: 2, enumerable: true },
c: { value: 3, enumerable: true },
age: { value: 10 }
}
);
Object.entries(person).forEach(function([key, value]) {//Называется `Деструктуризация`
console.log(key, value, person.age);
});
Если посмотреть на исходный цикл, видно что его входным параметром является только объект, свойства которого перебираются. Поэтому в функции нужно убрать параметр key.
Теперь, чтобы вывести ключ внутри коллбэка, его необходимо передать в качестве параметра
code(key);
const person = Object.create({
calculateAge() {
console.log(this.age);
}
}, {
name: {
value: 'Misha',
enumerable: true,
writable: false,
configurable: false
},
birthYear: {
value: 1993,
enumerable: true,
writable: false,
configurable: false
},
age: {
get() {
return new Date().getFullYear() - this.birthYear;
},
set(value) {
console.log('Set age', value + ', this age:', this.age);
}
}
});
for (let key in person) {
if (person.hasOwnProperty(key)) {
console.log(key, person[key], person.age);
}
} // Как я хочу, чтобы работало
function forInHasOwnProperty(object, code) {
for (let key in object) {
if (object.hasOwnProperty(key)) {
code(key);
}
}
}
forInHasOwnProperty(person, function(key) {
console.log(key, person[key], person.age);
});