是否有任何方法可以获取对象的属性名称而无需进行某种排序 对象本身内部的冗余'name'属性?这将主要用于 在我们用户试图获取不存在的对象的情况下。
例如:
let myObject = {
favoriteListing: {
name: 'favoriteListing',
category: 'favorite',
action: 'add'
},
sendListing: {
name: 'sendListing',
category: 'send',
action: 'sms'
}
};
let displayObj = (object) => {
if (!object) {
console.warn(`Whoa, cowboy. ${object.name} does not exist!`);
return;
} else {
return object;
}
}
预期与实际产出相比:
displayObj(myObject.favoriteListing);
/*
Output:
=> { name: 'favoriteListing', category: 'favorite', action: 'add' }
*/
displayObj(myObject.dammitBatman);
/*
Desired Output:
=> Whoa, cowboy. 'dammitBatman' does not exist!
Actual Output:
=> TypeError: Cannot read property 'name' of undefined
*/
答案 0 :(得分:1)
将对象和属性名称分开可以帮助您吗?如:
let displayObj = (obj,propertyName) => {
return obj && obj[propertyName] || console.warn(`Whoa, cowboy. ${propertyName} does not exist!`);
}
这里我们测试if对象是否未定义并返回它的命名属性或记录错误。 简洁!和javascripty( - :
答案 1 :(得分:1)
您可以从name
对象中删除名称redundantat myObject
属性,并修改displayObj()
函数,如下所示:
let displayObj = (obj, name)=>{
if(!obj[name]) {
console.warn("Whoa, cowboy. " + name + " does not exist!`");
return
}else return obj[name];
}
<强>被修改强> 更多
let displayObj = (obj, name)=>{
if(!obj){
console.warn("Unable to get " + name + "property of " + obj)
return
}
if(!obj[name]) {
console.warn("Whoa, cowboy. " + name + " does not exist!`");
return
}
return obj[name];
}
答案 2 :(得分:0)
我认为你应该使用hasOwnProperty:
myObject.hasOwnProperty("favoriteListing")
答案 3 :(得分:0)
在引用它之前,你必须测试该属性是否存在。
let displayObj = (object, property) => {
if (!object[property]) {
console.warn(`Whoa, cowboy. ${property} does not exist!`);
return;
} else {
return object;
}
}
displayObj(myObject, "joe");
displayObj(myObject, "sendListing");
答案 4 :(得分:0)
函数无法知道哪个参数属于哪个对象及其属性名称。因此,不可能像预期的那样得到理想的结果。
但是,多亏了javascript,我们通过一些修改使这成为可能。
下面的代码片段仅考虑您的要求而设计。
const PROPERTY = Symbol('property');
class InvalidProperty {
constructor(propertyName) {
this[PROPERTY] = propertyName;
}
get property(){
return this[PROPERTY];
}
}
function createProxy(obj){
return new Proxy(obj, {
get(target, prop){
if(!target.hasOwnProperty(prop)){
return new InvalidProperty(prop);
}
return target[prop];
}
});
}
let displayObj = (object) => {
if (object instanceof InvalidProperty) {
console.warn(`Whoa, cowboy. ${object.property} does not exist!`);
} else {
console.log(object);
}
}
let myObject = createProxy({
favoriteListing: {
name: 'favoriteListing',
category: 'favorite',
action: 'add'
},
sendListing: {
name: 'sendListing',
category: 'send',
action: 'sms'
}
});
displayObj(myObject.sendListing);
displayObj(myObject.thisDoesNotExist);
&#13;