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

标签 javascript arrays

首先我要声明的是,不,这个问题不是 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);
    });
}

这使得用户只需修改控件即可添加自己的键绑定(bind)。对于想要更多功能的用户来说非常容易理解和扩展。

这一切都很好,但我有点恼火,因为我知道即使在找到匹配的绑定(bind)并执行其回调之后它也会继续跳过绑定(bind)。因为,你知道,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);
}

您可能在到达 self 意识评论之前就发现了错误。我也这么做了。问题是这里有一层分离,并且将结构更改为类似......

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

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

是否有某种高效的、非库的、惯用的、递归的等价于indexOf的用于此目的?我应该使用类似 C 的 for 循环搜索和返回吗?既然一个理性的人只会制作/愿意记住这么多的绑定(bind),那么这是否值得担心?或者我应该不顾前一句而坚持原来的方法?

最佳答案

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

关于javascript - 如何检查嵌套数组中是否存在项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44470575/

相关文章:

javascript - 在 PDF 文件中使用 JavaScript 代码的文档

javascript - 如何在页面加载时调用 AJAX 函数

c - 用c语言简单连接四个游戏

java - 如何将文件的每一行保存到数组中?

javascript - 在 Angular 6 中使用 json 模式验证 json

javascript - 如何让DIV中的内容垂直对齐

Javascript正则表达式捕获下一个单词

java - 数组上的 Wordsearch 难题 nullpointerException

javascript - 总结对象数组的频率

c - 如何在 strcmp() 函数中使用字符数组