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