javascript - RangeError:无效的数组长度
问题描述
我想从对象上的键中获取一个数组,但是当对象为空时长度应该为 0。当我尝试使用数组时,数组的长度是正确的,console.log()
但我的代码卡在浏览器上抛出以下错误并停止执行:
RangeError: invalid array length
burger/transformedIngredients<
src/components/Burger/Burger.js:8
5 | const burger = (props) => {
6 | let transformedIngredients = Object.keys(props.ingredients).map(igKey => (
7 | // eslint-disable-next-line max-len,react/no-array-index-key
> 8 | [...Array(props.ingredients[igKey])].map((_, i) => <BurgerIngredient key={igKey + i} type={igKey} />)
9 | )).reduce((arr, el) => (
10 | arr.concat(el)
11 | ), []);
这是我正在使用的代码:
const burger = (props) => {
let transformedIngredients = Object.keys(props.ingredients).map(igKey => (
// eslint-disable-next-line max-len,react/no-array-index-key
[...Array(props.ingredients[igKey])].map((_, i) => <BurgerIngredient key={igKey + i} type={igKey} />)
)).reduce((arr, el) => (
arr.concat(el)
), []);
if (transformedIngredients.length === 0) {
transformedIngredients = <p>Please add some ingredients!</p>;
}
我ingredients
从这里经过:
class BurgerBuilder extends Component {
state = {
ingredients: {
salad: 0,
bacon: 0,
cheese: 0,
meat: 0,
},
totalPrice: 4,
};
render() {
return (
<Fragment>
<Burger ingredients={this.state.ingredients} />
<BuildControls
ingredientAdded={this.addIngredientHandler}
ingredientRemoved={this.removeIngredientHandler}
/>
</Fragment>
);
}
解决方案
如果其中一种成分具有负值,则可能会发生错误,例如:
state = {
ingredients: {
salad: -1, // this will cause the error
bacon: 0,
cheese: 0,
meat: 0,
},
totalPrice: 4,
};
您可以通过确保不会在Array
构造函数中传递负数来防止这种情况,例如,0
如果数字为负数,您可以传递:
[...Array(Math.max(0, props.ingredients[igKey]))]
推荐阅读
- javascript - 反应颜色无法读取未定义的属性“值”
- elasticsearch - 如何在本地重用搜索结果来创建新索引?
- android - Android Lollipop 没有改变 RatingBar 颜色
- python - Pyodbc 获取记录时速度慢
- kubernetes - 入口控制器 pod 未启动
- c# - 带有 Try Catch 的 while 循环在循环结束后抛出异常
- ios - 如何更改 SceneKit 中的场景?
- find - Clearcase :查找编号为 0 的所有元素版本,无论哪个分支
- sql - 如何将此混合行/列表转换为所需的输出。(Oracle SQL/发行版:Ora12c)
- spring-data-rest - 在 spring-data-rest 应用程序中验证请求参数