首先我要说的是,不,这个问题不是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循环搜索和返回?它是否值得担心,因为只有那么多合理的人能够/愿意记住的约束?或者我应该坚持使用原始方法,尽管上一句话?
答案 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()
}
}