javascript – 从属性值中获取属性键

给出以下 javascript对象:
var commands = {
    back:{
        command: "b",aliases: ["back","go back","backwards"],action: function(){
            return this.key; //I want this to return "back" (the prop name)
        },desc: "goes back"
    }
}

如何从action()中访问“返回”的Property Name?

我认为它应该很简单,但如果它不是简单的东西,我会添加更多的细节.

>注意:别名[0]偶然保留了名称,并且不承诺将来或其他命令保留它.

编辑:
有时我们会变得复杂,而我们可以很快解决问题.
在这种情况下,我可以继续并返回字符串“返回”

如果有这样的解决方案,我会留下问题并接受解决我问题的答案.

解决方法

如上所述返回字符串绝对是最简单的方法.但我可以看到有人可能希望能够通过动态创建的对象获得类似功能的情况,其中直到运行时才知道密钥.

在这种情况下可以使用的解决方案是将命令对象暴露给子对象,以便它们可以自我查找:

var commands = {
    back:{
        command: "b",action: function(){
            var commandKeys = Object.keys(commands);
            for(var i=0; i < commandKeys.length; i++){
                if(commands[commandKeys[i]] === this){
                    return commandKeys[i];
                }
            }
        },desc: "goes back"
    }
};

在这种情况下,在所有这些操作对象之间共享函数也可能更有意义:

var commands = {
    back:{
        command: "b",action: getAction,desc: "goes back"
    },forward: {
        //...
        action: getAction,//...
    }
};

function getAction() {
    var commandKeys = Object.keys(commands);
    for(var i=0; i < commandKeys.length; i++){
        if(commands[commandKeys[i]] === this){
            return commandKeys[i];
        }
    }
}

除非您需要为每个子对象执行某些特定逻辑.

编辑:为了提高效率,我们可以在每次调用时都不执行getAction函数,并添加一个存储名称属性.这样,查找仅在第一次发生.

var commands = {
    back:{
        command: "b",//...
    }
};
// Only needs to getKey the first time called.
function getAction() {
    if(!this.key) this.key = getKey(this);
    return this.key;
}
function getKey(obj) {
    var commandKeys = Object.keys(commands);
    for(var i=0; i < commandKeys.length; i++){
        if(commands[commandKeys[i]] === obj){
            return commandKeys[i];
        }
    }
}

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...