我有一个数组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'
答案 0 :(得分:1)
我个人喜欢创建一个数组,它可以实现键和函数之间的关系。所以我可以迭代并调用正确的那个。
我喜欢此解决方案而不是使用switch/case
或if/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'
,它会阻止两个。否则,它会阻止三个。