如何检查嵌套数组

时间:2017-06-10 07:02:02

标签: javascript arrays

首先我要说的是,不,这个问题不是How can I check If a nested array contains a value?的重复。我首先阅读了这个问题并确定它不符合我的要求。此问题涉及数组X的数组Y,其中搜索需要在任何Y中进行,而不知道要事先搜索哪个Y

我目前有一个算法作为“app”的一部分执行以下操作:

const controls = [
    ["f", "Foo the bar", function(unused){ ... }],
    ["b", "Bar the baz", function(ev){ ... }],
    ["?", "Show this help", function(unused){ ... }],
    ...
];
...
function ev_keyboard(ev){
    controls.forEach(function([key, unused, callback]){
        if(ev.key === key)
            callback(ev);
    });
}

这使得用户只需修改controls即可添加自己的密钥绑定。对于想要多一点的用户来说,超级易于理解和扩展。

这一切都很好,但我有点恼火的是,即使在找到匹配的绑定并执行其回调之后,它仍会继续跳过绑定。因为,你知道,forEach。所以,我试着改进它。

可以去上学并使用for循环:

for(let i = 0; i < controls.length; i++)
    if(controls[i][bind_key] === ev.key)
        return controls[i][bind_callback](ev);

或许更合适:

function find_bind(key){
    for(let i = 0; i < controls.length; i++)
        if(controls[i][bind_key] === key)
            return controls[i][bind_callback];

    return ()=>null;
}
...
function ev_keyboard(ev){
    find_bind(ev.key)(ev);
}

但是我被告知for循环因为某些原因是坏的(如果我不得不猜测,这是因为JS在无限循环中的深奥锁定行为)。所以这是替代修复:

function ev_keyboard(ev){
    let match = keyboard_controls.indexOf(ev.key); // what am I doing...

    if(match !== -1)
        keyboard_controls[match][bind_callback](ev);
}

你甚至在获得自我意识评论之前就已经发现了这个错误。我也是。问题是这里有一层分离,并将结构改为像......

{
    "f": ["Foo the Bar", function(unused){ ... }],
    ...
}

......对我来说似乎有点草率。

为此目的,是否存在某种有效的非库,惯用,递归等效于indexOf?我应该使用C-like for循环搜索和返回?它是否值得担心,因为只有那么多合理的人能够/愿意记住的约束?或者我应该坚持使用原始方法,尽管上一句话?

1 个答案:

答案 0 :(得分:1)

使用Array的find方法。见MDN Array.prototype.find

function ev_keyboard(ev) {
    const control = controls.find(([key, unused, callback]) => ev.key === key)
    // control could be undefined
    if (control && typeof control.callback === 'function') {
        control.callback()
    }
}