簡體   English   中英

數組 forEach 在上次迭代時覆蓋對象的值

[英]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對象中的12對象本身並沒有被“覆蓋”,而是將其父對象的父對象重置為{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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM