微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数组 forEach 在上次迭代时覆盖对象的值

如何解决数组 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 对象内的 2weeks 对象本身并没有被“覆盖”,而是它们的父对象的父 对象被重置为 {{ 1}}。

因此您需要将 {info: {},weeks: {}} 对象设置为自身(如果它存在),并且仅当它不设置为空白对象时。

您可以这样做:

weeks

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。