Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 一旦测试条件评估为真,则“删除”测试条件_Javascript_Arrays_Conditional Statements - Fatal编程技术网

Javascript 一旦测试条件评估为真,则“删除”测试条件

Javascript 一旦测试条件评估为真,则“删除”测试条件,javascript,arrays,conditional-statements,Javascript,Arrays,Conditional Statements,我正在对数组的成员进行处理 我需要测试成员是否满足某些条件 无论是否满足条件,都会在成员上执行一些代码 如果满足条件,则还应在成员上执行其他一些代码。 鉴于此 在整个阵列中,该条件将满足一次且仅满足一次。 我已经尝试过使用裸if语句。像这样: myArray.forEach((i) => { if (myCondition) { // Do something else. } // Do something. }); 但是,这并不理想,因为我不需要在满足此条件后在阵列

我正在对数组的成员进行处理

我需要测试成员是否满足某些条件

无论是否满足条件,都会在成员上执行一些代码 如果满足条件,则还应在成员上执行其他一些代码。 鉴于此

在整个阵列中,该条件将满足一次且仅满足一次。 我已经尝试过使用裸if语句。像这样:

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);