2

THANKS IN ADVANCE FOR ANY HELP! I always upvote btw

So I have this list of members

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',
  },
}

I'm trying to write a function that will return me the same list, but with an inserted calculated value, like THIS:

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',
  },
}

I've been trying:

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}
})

THANKS!

Clay_F
  • 561
  • 1
  • 6
  • 17

3 Answers3

1

Here is a solution but if you want to keep orignal copy of currentMembers, use Object.assign() or ES6 spread operator to make a copy of that.

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);
Zohaib Ijaz
  • 21,926
  • 7
  • 38
  • 60
1

You can use for..of loop, Object.entries(), Object.assign() approach by @Norris at 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);
Community
  • 1
  • 1
guest271314
  • 1
  • 15
  • 104
  • 177
1

If you're using babel with your react project, then depending in what stages you are including, then you might try something like this:

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
  }
});

This uses the spread operator combine objects. ES6 currently only allows for iterables to be combined using the spread operator, but using them with objects thanks to babel is a common React pattern, as it means you can avoid changing the original object.

Brett East
  • 4,022
  • 2
  • 20
  • 31
  • 2
    Your example does *not* use object destructing. You are using *spread properties* which are an *experimental feature* and not part of ES6. – Felix Kling Apr 24 '17 at 03:57
  • 1
    @FelixKling yeah, I realisd that after I posted. I just had object destructuring on the mind. Will fix that up now. Will also change the ES6 line to clear things up. – Brett East Apr 24 '17 at 03:59
  • 1
    Worked Perfect! THANK YOU! – Clay_F Apr 25 '17 at 00:03