如何在构造函数的对象定义中遍历数组创建对象属性?
解决对象声明中遍历数组生成属性的问题
嘿,这个坑我之前踩过!你没法直接在对象字面量的数组里嵌入for循环,因为对象的属性值必须是合法的表达式,而for是语句,不是表达式,所以浏览器会直接报错。给你几个实用的解决办法,按需选就行:
方法1:用Array.map()(最简洁推荐)
利用数组的map方法直接遍历parameterArray,把每个元素转换成你需要的dataset对象,一步生成目标数组:
function Constructor(parameterArray, fill, labels) { this.parameterArray = parameterArray; this.fill = fill; this.labels = labels; var object = { name: { label: labels }, datasets: parameterArray.map((param, index) => { // 这里根据你的需求构造每个dataset的结构,示例如下 return { label: param, fill: this.fill, data: [], // 可以根据param添加对应的数据 borderColor: `#${Math.floor(Math.random()*16777215).toString(16)}` // 示例:随机生成边框色 }; }) }; // 把生成的对象挂载到实例上,方便外部调用 this.chartConfig = object; }
map方法会自动遍历数组的每一项,返回的新数组就是你需要的datasets,长度和parameterArray完全一致。
方法2:先创建数组再赋值(兼容性拉满)
如果你的代码需要兼容旧环境(比如IE),或者更习惯传统的for循环,可以先初始化空数组,循环push元素后再赋值给对象:
function Constructor(parameterArray, fill, labels) { this.parameterArray = parameterArray; this.fill = fill; this.labels = labels; // 先初始化空的datasets数组 const datasets = []; // 用let声明i,避免全局变量污染 for (let i = 0; i < parameterArray.length; i++) { const currentParam = parameterArray[i]; datasets.push({ label: currentParam, fill: fill, // 其他自定义属性 }); } var object = { name: { label: labels }, datasets: datasets // 把生成好的数组赋值进去 }; this.chartConfig = object; }
这种写法逻辑清晰,所有浏览器都支持,适合需要兼容低版本环境的场景。
方法3:数组推导式(注意兼容性)
如果你用的是现代浏览器(Chrome、Firefox等),可以用ES6的数组推导式,写法和你最初的思路最接近,但IE完全不支持,所以谨慎使用:
function Constructor(parameterArray, fill, labels) { this.parameterArray = parameterArray; this.fill = fill; this.labels = labels; var object = { name: { label: labels }, datasets: [for (param of parameterArray) { { label: param, fill: fill } }] }; this.chartConfig = object; }
小提醒
不管用哪种方法,记得根据你的实际需求调整dataset对象的属性结构——比如你可能需要根据每个param设置不同的data或者样式,只要在生成对象的时候对应修改就行。
内容的提问来源于stack exchange,提问作者lovemyjob
相关产品推荐
相关产品推荐

