如何在对象内部没有冗余的“name”键的情况下获取对象的属性名称?以及如何返回用户提供的未定义对象的“名称”?

时间:2016-11-30 19:53:40

标签: javascript object

是否有任何方法可以获取对象的属性名称而无需进行某种排序 对象本身内部的冗余'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
*/

5 个答案:

答案 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,我们通过一些修改使这成为可能。

下面的代码片段仅考虑您的要求而设计。

&#13;
&#13;
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;
&#13;
&#13;