javascript - 如何从 javascript 中的对象获取相邻键及其键值?

标签 javascript javascript-objects

我有这个对象:

var registered_screens = {
    handle_1 : 'step_1',
    handle_2 : 'step_2',
    handle_3 : 'step_3'
};

这是我试图获取其邻居的信息:

function get_neighbors( current_step ) {
    var steps = {
        next: '',
        previous: ''
    };

    for( var i in registered_screens ) {
        if( current_step == registered_screens[i] ) {
            if(registered_screens.hasOwnProperty(registered_screens[i])) {
                steps.next = registered_screens[i+1];
            }

            if(registered_screens.hasOwnProperty(registered_screens[i-1])) {
                steps.previous = registered_screens[i-1];
            }
        }
    }

    return steps;
}

显然,这是不行的,因为对象不能像数组一样被解析,而只是想展示我尝试过的内容。

我想要得到的是,如果我调用get_neighbors('handle_2'),返回:

steps { prev : 'handle_1' , next : 'handle_3' }

或者,对于 get_neighbors('handle_3'):

steps { prev : 'handle_2', next : null }

我也尝试过:

var registered_screens = {
    handle_one : 'step_1',
    handle_2 : 'step_2',
    handle_3 : 'step_3'
};

var key_values = Object.keys(registered_screens);

for( var i = 0; i < key_values.length; i++ ) {
    console.log(registered_screens.key_values[i]);
}

但这会抛出:

main.js?ver=4.9.6:18 Uncaught TypeError: Cannot read property '0' of undefined
main.js?ver=4.9.6:18
main.js?ver=4.9.6:270

有趣的是,我检查了 key_values[i] 的值,它们是正确的句柄。

JS 似乎很难用字符串构建变量?

最佳答案

我不太喜欢它,并且会考虑重组以使 registered_screens 成为一个数组。由于 object order can not be guaranteed 我也不信任此代码。

也就是说,这适用于我的浏览器。

编辑:添加了一个数组版本,我会信任该版本,但会扩展为空白(未定义)结果。

// array version
var aScreens = [];
    aScreens['handle_one'] = 'step_1';
    aScreens['handle_2'] = 'step_2';
    aScreens['handle_3'] = 'step_3';

function getArrayPrevNext(a,current) {
    var x,p = '',n = '',found = false;
    for(x in a) {
        if (found) {
            n = x;
            break;
        } else if (x == current) {
            found = true;
        } else {
            p = x;
        }
    }
    return {prev:p,next:n};
}

var aSteps = getArrayPrevNext(aScreens,'handle_3');
console.log('array prev['+ aSteps.prev +'], next['+ aSteps.next +']');
var p = aSteps.prev, n = aSteps.next;
console.log('handle prev['+ aScreens[p] +'], next['+ aScreens[n] +']');
console.log('handle alt prev['+ aScreens[aSteps.prev] +'], next['+ aScreens[aSteps.next] +']');


// Object version
var registered_screens = {
    handle_one : 'step_1',
    handle_2 : 'step_2',
    handle_3 : 'step_3'
};


function getPreviousNext(obj,current) {
    var prev = '', nxt = '', found = false;
    Object.keys(obj).forEach(function(key) {
       if (! nxt) {
           if (found) {
               nxt = key; 
           } else if (key == current) {
               found = true;
           } else {
               prev = key; 
           }
       }
    });
    return {prev:prev,next:nxt};
}

var steps = getPreviousNext(registered_screens,'handle_3');
console.log('Object steps:['+ steps.prev +']['+ steps.next +']');

关于javascript - 如何从 javascript 中的对象获取相邻键及其键值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50780430/

相关文章:

javascript - 套接字远程端口代表什么?

javascript - jquery 替换 '/' - 正则表达式

JavaScript 似乎无法访问对象属性

javascript - Chrome 58.0.3029.110 版本未将日期转换为正确的本地时区

javascript - angularJS/breeze 删除 'intermediate' 负数条目(HTML5)

javascript - 在 React 渲染方法上解构 Prop 时的性能问题

javascript - 组合对象数组的特定属性

JavaScript 1 时间间隔?

Javascript:在子对象属性中访问父对象的属性

javascript - 在对象字面量中添加属性会产生 NaN