0

I have an object called guild, that has the following array:

members: [
{
uuid: "6afc724d566746c796d13b233c9960ea",
rank: "MEMBER",
joined: 1492733608170,
dailyCoins-1-5-2017: 920,
dailyCoins-2-5-2017: 790,
dailyCoins-3-5-2017: 260,
dailyCoins-4-5-2017: 790
},
{
uuid: "fa014557f1ac4325b23940fb872031a4",
rank: "MEMBER",
joined: 1493332956351
},
etc.

How can I add together the value of each string that contains the string "dailyCoins" ?

Here is my current attempt:

 var guildMembers = [];
 var memberCoins = 0;
    for (i = 0; i < guild.members.length; i++) {
        for (j = 0; j < Object.keys(guild.members[i]).length; j++)
            console.log(Object.keys(guild.members[i]));
            if (Object.keys(guild.members[i])[j].includes("dailyCoins")) {
                var memberCoins = memberCoins + Object.values(guild.members[i])[j];
            }
        var member = {
            uuid: guild.members[i].uuid,
            rank: guild.members[i].rank,
            joined: guild.members[i].joined,
            coins: memberCoins
        };
        guildMembers.push(member);
    }
3
  • Would it not be easier to change your starting object so that dailyCoins is an object itself structured like {date:"1-5-2017",value:920}? Commented Jun 5, 2017 at 13:31
  • The code should give a syntax error, wich is easy to resolve. Commented Jun 5, 2017 at 13:35
  • @George The object comes from an API, so doing it this way is the only one I can think of. Commented Jun 5, 2017 at 14:08

4 Answers 4

1

This code should solve it in your way.

var guildMembers = [];
for (i = 0; i < members.length; i++) {
  let memberCoins = 0;
    for (j = 0; j < Object.keys(members[i]).length; j++)
        if (Object.keys(members[i])[j].includes("dailyCoins")) {
             memberCoins = memberCoins + members[i][Object.keys(members[i])[j]];
        }
    var member = {
        uuid: members[i].uuid,
        rank: members[i].rank,
        joined: members[i].joined,
        coins: memberCoins
    };
    guildMembers.push(member);
}
Sign up to request clarification or add additional context in comments.

Comments

0

Why are you reinitializing memberCoins in loop?

Just change this line

var memberCoins = memberCoins + Object.values(guild.members[i])[j];

to

memberCoins += Object.values(guild.members[i])[j];

Complete Code

var guildMembers = [];
    var memberCoins = 0;
for (i = 0; i < guild.members.length; i++) {
    for (j = 0; j < Object.keys(guild.members[i]).length; j++) {
        console.log(Object.keys(guild.members[i]));

        if (Object.keys(guild.members[i])[j].includes("dailyCoins")) {
            memberCoins += Object.values(guild.members[i])[j];
        }
    }
var member = {
    uuid: guild.members[i].uuid,
        rank: guild.members[i].rank,
    joined: guild.members[i].joined,
    coins: memberCoins
};
guildMembers.push(member);
}

Comments

0
var members=guild.members.map(function(el){
  return {
        uuid: el.uuid,
        rank: el.rank,
        joined: el.joined,
        coins: Object.keys(el).filter(str=>str.includes("dailyCoins")).reduce((c,str)=>c+el[str],0)
    };      
});

You can simplify it using Array.filter / reduce...

Comments

0

You could use map to iterate over your collection, Object.keys(obj) to fetch object properties, then filter to filter required object properties and reduce to accumulate result:

var members  = [
  {
    'uuid': "6afc724d566746c796d13b233c9960ea",
    'rank': "MEMBER",
    'joined': 1492733608170,
    'dailyCoins-1-5-2017': 920,
    'dailyCoins-2-5-2017': 790,
    'dailyCoins-3-5-2017': 260,
    'dailyCoins-4-5-2017': 790
  },
  {
    'uuid': "fa014557f1ac4325b23940fb872031a4",
    'rank': "MEMBER",
    'joined': 1493332956351
  }
];

var guildMembers = members.map(function(row) { 
    var filter = function(key) { return key.indexOf('dailyCoins') >= 0; };        
    var reduce = function(sum, current) { return sum + row[current]; };
    
    return {
    	uuid: row.uuid,
    	rank: row.rank,
    	joined: row.joined,
    	coins: Object.keys(row).filter(filter).reduce(reduce, 0)
    };    
});

console.log(guildMembers);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.