[英]Array forEach overwriting value of object on last iteration
我正在遍歷一個文件名數組,拆分名稱並將數據存儲在一個對象中。 用於測試目的的兩個文件名是相同的,除了周“編號”應該創建兩個單獨的周。 問題是第一個條目被最后一次迭代覆蓋,所以我最終只有第 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, _planSeries, _planTitle, _planO, _planWeek] = _plan.split('.')[0].split('_'), // 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]
。 因此, weeks
對象中的1
或2
對象本身並沒有被“覆蓋”,而是將其父對象的父對象重置為{info: {}, weeks: {}}
。
因此,您需要將weeks
對象設置為自身(如果存在),並且僅當它不設置為空白對象時。
以下是您將如何做到這一點:
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 // _planWeek logs 1 and 2 while iterating but entry for .weeks.1 is overwritten with .weeks.2 _completePlan[_planTitle] = _completePlan[_planTitle] || {}; _completePlan[_planTitle].info = _completePlan[_planTitle].info || {}; _completePlan[_planTitle].weeks = _completePlan[_planTitle].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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.