【问题标题】:Iterate Over List of Objects but Insert a Calculated Value迭代对象列表但插入计算值
【发布时间】:2017-09-20 13:31:18
【问题描述】:

提前感谢您的帮助!顺便说一句,我总是赞成

所以我有这个成员列表

export const currentMembers= {
  'A1': {
    'memberStartDate': 0,
    'currentContractEndDate': 0,
    'flagged': false,
    'notes': 'Some Notes about member',
    'memberId': 'A1',
  },
  'A2': {
    'memberStartDate': 1454306400000,
    'currentContractEndDate': 1501747600000,
    'notes': 'Some Notes about member',
    'flagged': false,
    'memberId': 'A2',
  },
  'A3': {
    'memberStartDate': 1454306400000,
    'currentContractEndDate': 1502747600000,    
    'notes': 'Some Notes about member',
    'flagged': false,
    'memberId': 'A3',
  },
}

我正在尝试编写一个函数,该函数将返回相同的列表,但插入了一个计算值,如下所示:

export const currentMembersModified = {
  'A1': {
    'memberStartDate': 0,
    'currentContractEndDate': 0,
    'daysRemainingInContract': 0,  // calculated from currentMembers object above
    'flagged': false,
    'notes': 'Some Notes about member',
    'memberId': 'A1',
  },
  'A2': {
    'memberStartDate': 1454306400000,
    'currentContractEndDate': 1501747600000,
    'daysRemainingInContract': 123,  // calculated from currentMembers object above
    'notes': 'Some Notes about member',
    'flagged': false,
    'memberId': 'A2',
  },
  'A3': {
    'memberStartDate': 1454306400000,
    'currentContractEndDate': 1502747600000,
    'daysRemainingInContract': 234, // calculated from currentMembers object above
    'notes': 'Some Notes about member',
    'flagged': false,
    'memberId': 'A3',
  },
}

我一直在尝试:

const modifiedMembers = Object.keys(currentMembers).forEach(key => {
  const currentMemberObject = currentMembers[key]

  const currentDate = new Date()
  const currentEndDate = currentMembers[key].currentContractEndDate
  const calculatedDateStuff = currentEndDate - currentDate

  return {stuff I don't know how to do}
})

谢谢!

【问题讨论】:

  • 所有很棒的建议,今晚下班回家我会试试看!我正在使用 create-react-app / react / redux 所以不可变性是必不可少的。
  • @Gerardo 非常棒!!正是我需要的!谢谢!

标签: javascript reactjs ecmascript-6 redux


【解决方案1】:

如果你在你的 react 项目中使用 babel,那么根据你所包含的阶段,你可以尝试这样的事情:

var newMembers; // new object/state
Object.keys(currentMembers).forEach((key) => {
  var calculatedDays = currentMembers[key].currentContractEndDate - 21343214213; // or whatever logic you need here
  var member = {};
  member[key] = {
        ...currentMembers[key],
      calculatedDays
    }
  newMembers = {
    ...newMembers,
    ...member
  }
});

这使用扩展运算符组合对象。 ES6 目前只允许使用扩展运算符组合可迭代对象,但由于 babel 将它们与对象一起使用是一种常见的 React 模式,因为这意味着您可以避免更改原始对象。

【讨论】:

  • 你的例子使用对象破坏。您正在使用 扩展属性,它是一个 实验性功能,而不是 ES6 的一部分。
  • @FelixKling 是的,我发帖后才意识到这一点。我只是想到了对象解构。现在会解决这个问题。还将更改 ES6 行以清除问题。
  • 工作完美!谢谢!
【解决方案2】:

这是一个解决方案,但如果您想保留 currentMembers 的原始副本,请使用 Object.assign() 或 ES6 扩展运算符制作副本。

for (key in currentMembers) {
  var currentMemberObject = currentMembers[key]

  var currentDate = new Date()
  var currentEndDate = currentMembers[key].currentContractEndDate
  var calculatedDateStuff = currentEndDate - currentDate;
  // fix logic to calculate number of days yourself, however, here is how
  // you need to update those objects
  currentMembers[key]['daysRemainingInContract'] = calculatedDateStuff
}

console.log(currentMembers);

【讨论】:

  • 你也可以使用currentMemberObject.daysRemainingInContract = calculatedDateStuff来设置值
【解决方案3】:

您可以使用for..of 循环,Object.entries()Object.assign() 通过@Norris How do I get the number of days between two dates in JavaScript? 接近

const currentMembersModified = new Object;

const currentMembers= {
  'A1': {
    'memberStartDate': 0,
    'currentContractEndDate': 0,
    'flagged': false,
    'notes': 'Some Notes about member',
    'memberId': 'A1',
  },
  'A2': {
    'memberStartDate': 1454306400000,
    'currentContractEndDate': 1501747600000,
    'notes': 'Some Notes about member',
    'flagged': false,
    'memberId': 'A2',
  },
  'A3': {
    'memberStartDate': 1454306400000,
    'currentContractEndDate': 1502747600000,    
    'notes': 'Some Notes about member',
    'flagged': false,
    'memberId': 'A3',
  }
}

for (const [key, prop] of Object.entries(currentMembers)) {

  const {memberStartDate, currentContractEndDate} = prop;  
 
  const [to, from] = [
    // https://stackoverflow.com/a/20082660/
    Math.floor(new Date(currentContractEndDate).getTime() / (3600*24*1000)),
    Math.floor(new Date(memberStartDate).getTime() / (3600*24*1000))
  ];
  
  Object.assign(currentMembersModified
  , {[key]:Object.assign({}, prop, {daysRemainingInContract: to - from})});
  
}

console.log(currentMembersModified);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2015-12-12
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多