array.every()仅处理首个元素问题求助:实现数组全元素遍历
数组遍历用every()提前终止的问题排查与解决
你定义的数组:
errorPriority: string[] = ['shippingError', 'paymentInfoError', 'generalError'];
调用遍历的方式:
this.errorPriority.every(this.getErrorData)
被调用的处理函数:
getErrorData = (value: string): void => { if (eval(this.objectPath[value as keyof ObjectPath]) && eval(this.objectPath[value as keyof ObjectPath]).length) this.checkoutState.errors[value] = eval(this.objectPath[value as keyof ObjectPath]); }
问题原因
问题出在every()方法的核心特性上:every()的设计目的是验证数组所有元素是否都满足回调函数的条件,只要回调返回false(或被视为false的值,比如undefined、null等),就会立即终止遍历,不再处理后续元素。
你的getErrorData返回类型是void,实际执行后返回的是undefined,而undefined在布尔判断中会被判定为false,所以第一个元素执行完成后,every()就直接停止了遍历。
解决方案
替换遍历方法:如果需要遍历数组所有元素,改用
forEach()方法,它会无条件执行完数组的每一个元素,不受回调返回值影响:this.errorPriority.forEach(this.getErrorData);移除不安全的
eval():eval()存在安全风险且性能较差,建议通过属性访问语法替代,同时避免重复计算:getErrorData = (value: string): void => { const targetData = this.objectPath[value as keyof ObjectPath]; if (targetData && targetData.length) { this.checkoutState.errors[value] = targetData; } }
内容的提问来源于stack exchange,提问作者Manoj G
相关产品推荐
相关产品推荐

