Javascript 一旦测试条件评估为真,则“删除”测试条件
我正在对数组的成员进行处理 我需要测试成员是否满足某些条件 无论是否满足条件,都会在成员上执行一些代码 如果满足条件,则还应在成员上执行其他一些代码。 鉴于此 在整个阵列中,该条件将满足一次且仅满足一次。 我已经尝试过使用裸if语句。像这样:Javascript 一旦测试条件评估为真,则“删除”测试条件,javascript,arrays,conditional-statements,Javascript,Arrays,Conditional Statements,我正在对数组的成员进行处理 我需要测试成员是否满足某些条件 无论是否满足条件,都会在成员上执行一些代码 如果满足条件,则还应在成员上执行其他一些代码。 鉴于此 在整个阵列中,该条件将满足一次且仅满足一次。 我已经尝试过使用裸if语句。像这样: myArray.forEach((i) => { if (myCondition) { // Do something else. } // Do something. }); 但是,这并不理想,因为我不需要在满足此条件后在阵列
myArray.forEach((i) => {
if (myCondition) {
// Do something else.
}
// Do something.
});
但是,这并不理想,因为我不需要在满足此条件后在阵列的其他成员上测试此条件
那我该怎么做呢
避免不必要的条件测试
不引入另一个迭代
以优雅的方式?
谢谢你的耐心
编辑:这里有一个更精确的例子
Object.entries(modes).forEach(([key, value]) => {
console.log(key, value);
if (!currentTheme.endsWith(key)) {
// Do something else.
}
element.parentElement!.appendChild(element.cloneNode(true));
const clonedElement = element.parentElement!.lastElementChild;
clonedElement!.classList.remove(currentTheme);
// Do something. (This code is not finished.)
});
编辑:另一个类似的场景:
除了只在满足条件的项目上执行一段代码外,所有其他要求都是相同的。通过使用其他功能,我们可以满足您3项要求中的2项&无需额外迭代
function doStuff(theme){
//Do stuff with the theme
return theme
}
Object.entries(modes).forEach(([key, value]) => {
console.log(key, value);
if (!currentTheme.endsWith(key)) { currentTheme = doStuff(currentTheme) }
element.parentElement!.appendChild(element.cloneNode(true));
const clonedElement = element.parentElement!.lastElementChild;
clonedElement!.classList.remove(currentTheme);
// Do something. (This code is not finished.)
});
没有内置的进入forEach的能力。要中断执行,您必须抛出某种异常。例如
let arrTest = [
{
name: 'harry',
age: 3
},
{
name: 'sam',
age: 21
},
{
name: 'max',
age: 32
},
{
name: 'james',
age: 51
},
{
name: 'robert',
age: 42
},
{
name: 'walter',
age: 58
},
]
var BreakException = {};
try {
arrTest.forEach(function(el) {
console.log(el);
if (el.name === 'sam'){
console.log('THE CONDITION IS MET!');
throw BreakException;
}else{
console.warn('no no no!');
}
});
} catch (e) {
if (e !== BreakException) throw e;
}
或者您可以使用这样一个简单的for循环->
let arrTest = [
{
name: 'harry',
age: 3
},
{
name: 'sam',
age: 21
},
{
name: 'max',
age: 32
},
{
name: 'james',
age: 51
},
{
name: 'robert',
age: 42
},
{
name: 'walter',
age: 58
},
]
for(let i = 0; i <= arrTest.length; i++){
if(arrTest[i].name === 'sam'){
console.log('THE CONDITION IS MET!');
break;
}else{
console.warn('no no no!');
}
}
希望有帮助 将条件测试设置为在条件达到时更改的内容 这样我们就可以满足这三个要求 它可能会降低代码的性能,但对于一些更复杂的条件测试可能会有所帮助 const reallyApplyTheme=currentTheme:string,key:string,element:HTMLElement=>{ element.parentElement!.appendChildelement.cloneNodetrue; const clonedElement=element.parentElement!.lastElementChild; clonedElement!.classList.删除“主题化的\活动的\真实的”; clonedElement!.classList.添加'themed_active_false'; clonedElement!.classList.removecurrentTheme; clonedElement!.classList.add`theme\${key}`; }; 让applyTheme=currentTheme:string,key:string,element:HTMLElement=>{ 如果currentTheme.endsWithkey{ applyTheme=currentTheme:string,key:string,element:HTMLElement=>{ 真正应用当前主题、关键、元素; }; 回来 } 真正应用当前主题、关键、元素; }; export const duplicate=functionelement:HTMLElement,modes:object{ const currentTheme=Array.fromement.classList.findx=>x.startsWith'themed_theme_'!; console.logcurrent主题; Object.entriesmodes.forEach[键,值]=>{ console.logkey; console.logvalue; applythemecurrent主题、键、元素; }; };
您可以在这里使用一个全局变量:TYPE,它控制要使用的函数版本 myArray=[2,6,7,8,10,4,0,12,14,32,40];//仅发生一次的情况为v%2 类型=0; doStuff=functionv{return[ //常规函数版本类型=1 函数{ 如果v%2{TYPE=1;//从现在开始:使用简化函数版本! console.log‘嘿,我找到了,不再找了!’ console.log'Regular work on value'+v,键入; 返回v*v}, //简化功能版本类型=2 functionv{console.log'Simplified work on value'+v; 返回v*v} ][类型]v};
myArray.ForeachDostuff您能提供更多关于数据和条件的信息吗?如果不添加另一个条件,这将是不可能的,这将毫无用处。@Teemu谢谢。但是,我仍然不能确定这一点。forEach是否可以在所有项目上运行。然后使用.find在满足条件的第一项上运行特定代码。@fakeinc我能想到的唯一优雅的方法是将所有条件路由到另一个函数,这样它就不会阻塞当前循环。你没什么可以做的,但这不是我想要的。也许我的问题仍然让人困惑?对不起,我宁愿不要额外的条件测试也不要优雅。我肯定我找到了办法。一旦我组织起来,我会回答我自己的问题。哇!这真是太棒了。非常感谢。我要这个。
let arrTest = [
{
name: 'harry',
age: 3
},
{
name: 'sam',
age: 21
},
{
name: 'max',
age: 32
},
{
name: 'james',
age: 51
},
{
name: 'robert',
age: 42
},
{
name: 'walter',
age: 58
},
]
let requiredItemFromAnArray = arrTest.find(el => el.name == 'sam');
console.log('requiredItemFromAnArray --> ', requiredItemFromAnArray);