如果在foreach中

时间:2018-05-25 11:53:45

标签: javascript angular

我有一个数组arr=[{key: 'first'},{key: 'second'} ...],我想通过该数组并检查是否存在具有特定键的元素并执行某些操作。

  arr.forEach(element => {
     if(element.key === 'first') {
        // do something
     } else { 
        // do something else
     }

     if(element.key === 'second') {
        // do something
     } else { 
        // do something else
     }         
  });

问题是,当它通过数组时,它首先看到'first'并且它通过if()语句,但它也会通过else()'second'语句因为它没有找到它,所以当foreach通过数组中的其他项时它会这样做。我不知道如何让它通过一次数组并适当地设置if() else()。因此,当它找到'first'时,我希望它只是if()该项目,而不是else()其他项目。我希望你明白。提前谢谢!

编辑:我的代码背后的逻辑是,当我调用数据库并找到该数组时,如果该数组中没有'firstExercise',那么它应该将它添加到该数据库(我在{{我使用的是firebase) 1}}我正在调用db来创建该练习),如果数组中有else()则不执行任何操作。很抱歉没有澄清。

Edit2:这是我的原始代码:

'firstExercise'

3 个答案:

答案 0 :(得分:1)

我个人喜欢创建一个数组,它可以实现键和函数之间的关系。所以我可以迭代并调用正确的那个。

我喜欢此解决方案而不是使用switch/caseif/else林,您可以应用自动处理,并且可以轻松地使其进化。

const mapKeyFunc = [{
  key: 'first',

  func: async(x) => {
    console.log('Do something for key first');

    // here you can perform an async request and modify `this`
  },
}, {
  key: 'second',

  func: async(x) => {
    console.log('Do something for key second');

    // here you can perform an async request and modify `this`
  },
}];

const doStuff = async(arr) => {
  for (let i = 0; i < arr.length; i += 1) {
    const mapElement = mapKeyFunc.find(x => x.key === arr[i].key);

    await mapElement.func.call(this, arr[i]);
  }
};

const arr = [{
  key: 'first',
  otherStuff: 0,
}, {
  key: 'second',
  otherStuff: 42,
}];

doStuff(arr).then(() => {}).catch(e => console.log(e));

如果您不需要同步处理,这里我们有一个异步方法

const mapKeyFunc = [{
  key: 'first',

  func: async(x) => {
    console.log('Do something for key first');

    // here you can perform an async request and modify `this`
  },
}, {
  key: 'second',

  func: async(x) => {
    console.log('Do something for key second');

    // here you can perform an async request and modify `this`
  },
}];

const doStuff = async(arr) => {
  await Promise.all(arr.map(x => mapKeyFunc.find(y => y.key === x.key).func.call(this, x)));
};

const arr = [{
  key: 'first',
  otherStuff: 0,
}, {
  key: 'second',
  otherStuff: 42,
}];

doStuff(arr).then(() => {}).catch(e => console.log(e));

答案 1 :(得分:0)

您需要合并if语句,如下所示:

  arr.forEach(element => {
     if(element.key === 'first') {
        // do something
     } else if(element.key === 'second') {
        // do something else
     }         
  });

element.key在每次迭代中都有一个值,因此您需要一个级别的条件。

答案 2 :(得分:0)

如果你只想要执行一个选项(然后退出函数),你可以使用else if这样的语句:

arr.forEach(element => {
  if(element.key === 'first') {
     // do something
  } else if(element.key === 'second') {
     // do something
  } else { 
     // do something else
  }         
});

这将完全符合您的期望。如果element.key == 'first',它会阻止一个。否则,如果element.key == 'second',它会阻止两个。否则,它会阻止三个。