我有一个名为UrlBuilder的类,它遍历.json文件然后构建URL。我可以到达循环数据并打印正确的输出,但当我尝试将其推送到类构造函数中定义的数组时,我被告知数组是未定义的。
这是我的代码:
"use strict";
const DATA = require("../resources/data.json").services;
class UrlBuilder {
constructor() {
this.serviceArr = [];
}
static _iterateAndBuild(current_val, index, array) {
for(let path of current_val.paths) {
let url = current_val.baseURL + Object.values(path);
this.serviceArr.push(url);
}
let recHistUrl = current_val.server + current_val.recordHistoryUrl;
serviceArr.push(recHistUrl);
console.log("Pushing this value to array: " + recHistUrl);
}
buildServiceArr() {
DATA.forEach(UrlBuilder._iterateAndBuild);
}
}
module.exports = UrlBuilder;
正如您所看到的,我打破了forEach的回调函数。因此,当我调用UrlBuilder.buildServiceArr
时,它会遍历DATA对象并执行上面写的回调。
这是输出:
C:\用户\ payton.juneau \桌面\我\项目\节点\ com.etouchmenu.serviceSpyGlass>节点 app.js C:\ Users \用户payton.juneau \桌面\我\项目\节点\ com.etouchmenu.serviceSpyGlass \公用事业\ urlBuilder.js:13 this.serviceArr.push(URL); ^ TypeError:无法读取未定义的属性'serviceArr' 在_iterateAndBuild(C:\ Users \ payton.juneau \ Desktop \ Me \ Projects \ Node \ com.etouchmenu.serviceSpyGlass \ utilities \ urlBuilder.js:13:18) 在Array.forEach() 在UrlBuilder.buildServiceArr(C:\ Users \ payton.juneau \ Desktop \ Me \ Projects \ Node \ com.etouchmenu.serviceSpyGlass \ utilities \ urlBuilder.js:23:14) 在对象。 (C:\ Users \用户payton.juneau \桌面\我\项目\节点\ com.etouchmenu.serviceSpyGlass \ app.js:10:12) 在Module._compile(module.js:660:30) at Object.Module._extensions..js(module.js:671:10) 在Module.load(module.js:573:32) 在tryModuleLoad(module.js:513:12) 在Function.Module._load(module.js:505:3) 在Function.Module.runMain(module.js:701:10)
感谢您提前的时间!可能像范围一样愚蠢。
答案 0 :(得分:3)
DATA.forEach(UrlBuilder._iterateAndBuild);
应该是
DATA.forEach(UrlBuilder._iterateAndBuild, this);
以this
buildServiceArr
作为this
的{{1}}传递。
作为一般风格评论,如果你有一个不应该作为静态公开的函数,只需把它放在课后,例如
_iterateAndBuild
虽然对于你的情况,我不确定它为什么是静态的而不是实例方法,例如
class UrlBuilder {
// ...
buildServiceArr() {
DATA.forEach(iterateAndBuild);
}
}
function iterateAndBuild(current_val, index, array) {
// ...
}
这将更符合你的目标。
答案 1 :(得分:0)
您应该可以使用
进入阵列 this.serviceArr.push(recHistUrl);