繁体   English   中英

如何检查项目是否存在于嵌套数组中

[英]How to check if item exists within nested array

让我从声明“否”开始,这个问题不是“ How can I check If a nested array contains a value?的重复项How can I check If a nested array contains a value? 我先阅读了该问题,并确定它不符合我的要求。 此问题涉及数组Y的数组X ,其中搜索需要在任何Y而无需事先知道要搜索哪个Y


我目前有一种算法是“应用程序”的一部分,可以执行以下操作:

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的循环搜索和返回吗? 既然一个理性的人会想起/愿意记住的绑定就这么多,是否值得担心呢? 还是尽管前一句话我还是应该坚持原始方法?

使用数组的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()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM