如何解决数组 forEach 在上次迭代时覆盖对象的值
我正在遍历一个文件名数组,拆分名称并将数据存储在一个对象中。用于测试目的的两个文件名是相同的,除了周“编号”应该创建两个单独的周。问题是第一个条目被最后一次迭代覆盖,所以我最终只有第 2 周的条目。
代码:
const planList = [
'military_greekHero_achilles_week_1.htm','military_greekHero_achilles_week_2.htm'
];
var _completePlan = {};
planList.forEach(_plan => {
// Pull data from the file name formated: target_series_title_overview/week_weekNum.htm
let _planPieces = _plan.split('.')[0].split('_'),// Drop the .htm
_planTarget = _planPieces[0],_planSeries = _planPieces[1],_planTitle = _planPieces[2],_planOverview = _planPieces[3],_planWeek = _planPieces[4];
_planOverview = _planOverview == 'overview' ? true : false;
// Start Building Plan Object
_completePlan[_planTitle] = {
info: {},weeks: {}
}
// _planWeek logs 1 and 2 while iterating but entry for .weeks.1 is overwritten with .weeks.2
_completePlan[_planTitle].weeks[_planWeek] = {
sn: { inactive: true },mo: { inactive: true },tu: { inactive: true },we: { inactive: true },th: { inactive: true },fr: { inactive: true },st: { inactive: true }
}
});
console.log(_completePlan);
});
我觉得我错过了一些简单的东西......有什么想法吗?
解决方法
您只需要在尝试创建对象之前检查它是否已经存在(从而覆盖之前的对象):
if (!_completePlan.hasOwnProperty(_planTitle)) {
_completePlan[_planTitle] = {
info: {},weeks: {}
}
}
我还添加了一个有助于减少一些代码的重组语句:
let [_planTarget,_planSeries,_planTitle,_planO,_planWeek] = _plan.split('.')[0].split('_'),// Drop the .htm
_planOverview = _planO === 'overview' ? true : false;
const planList = [
'military_greekHero_achilles_week_1.htm','military_greekHero_achilles_week_2.htm'
];
var _completePlan = {};
planList.forEach(_plan => {
// Pull data from the file name formated: target_series_title_overview/week_weekNum.htm
let [_planTarget,// Drop the .htm
_planOverview = _planO === 'overview' ? true : false;
// Start Building Plan Object
if (!_completePlan.hasOwnProperty(_planTitle)) {
_completePlan[_planTitle] = {
info: {},weeks: {}
}
}
_completePlan[_planTitle].weeks[_planWeek] = {
sn: { inactive: true},mo: { inactive: true},tu: { inactive: true},we: { inactive: true},th: { inactive: true},fr: { inactive: true},st: { inactive: true}
}
});
console.log(_completePlan);
您每次迭代都会重置整个 _completePlan[_planTitle]
。因此,1
对象内的 2
或 weeks
对象本身并没有被“覆盖”,而是它们的父对象的父 对象被重置为 {{ 1}}。
因此您需要将 {info: {},weeks: {}}
对象设置为自身(如果它存在),并且仅当它不设置为空白对象时。
您可以这样做:
weeks
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。