1

I have a JSON array like this and,

const arrayVal = [{
    "DATE": "2020-12-1",
    "NAME": "JAKE",
    "TEAM_NO": 2,
    
}, {
    "DATE": "2020-12-1",
    "NAME": "ANNA",
    "TEAM_NO": 2,
    
}, {
    "DATE": "2020-12-1",
    "NAME": "JEFF",
    "TEAM_NO": 1,
    
}, {
    "DATE": "2020-12-1",
    "NAME": "ERIKA",
    "TEAM_NO": 2,
   
}, {
    "DATE": "2020-12-1",
    "NAME": "SUTTON",
    "TEAM_NO": 3,
}, {
    "DATE": "2020-12-1",
    "NAME": "ARNOLD",
    "TEAM_NO": 3,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "JAKE",
    "TEAM_NO": 4,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "ANNA",
    "TEAM_NO": 2,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "JEFF",
    "TEAM_NO": 1,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "ERIKA",
    "TEAM_NO": 3,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "SUTTON",
    "TEAM_NO": 5,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "ARNOLD",
    "TEAM_NO": 5,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "JAKE",
    "TEAM_NO": 1,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "ANNA",
    "TEAM_NO": 1,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "JEFF",
    "TEAM_NO": 1,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "ERIKA",
    "TEAM_NO": 2,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "SUTTON",
    "TEAM_NO": 3,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "ARNOLD",
    "TEAM_NO": 3,
      
}];

I am just trying to get below kind of reult out of above array. In this I want to count team numbers by day and create a new array with "TEAM_NO_COUNT" parameter.

[{
    "DATE": "2020-12-1",
    "TEAM_NO": 3, 
    "TEAM_NO_COUNT": 2, // 2 entries with no 3 team
     
}, {
    "DATE": "2020-12-1",
    "TEAM_NO": 1,
    "TEAM_NO_COUNT": 2,  // 2 entries with no 1 team
}, {
    "DATE": "2020-12-2",
    "TEAM_NO": 4,
    "TEAM_NO_COUNT": 1,  
}]

I have this code so far but it just give me a json object with counted team numbers, But It is not I want, I need above exact result.

TEAM_NO_COUNT = {}; // create an object
$.each(JSON.parse(JSON.stringify(arrayVal)), function (key, val) {

DATE_NO_CO = {};

  TEAM_NO_COUNT[val.DATE] = (TEAM_NO_COUNT[val.DATE] || {});

  TEAM_NO_COUNT[val.DATE][val.TEAM_NO] = (TEAM_NO_COUNT[val.DATE][val.TEAM_NO] || 0) + 1;
  
});

alert(JSON.stringify(TEAM_NO_COUNT));

Could someone please give me a help. It would be highly appreciated. Thanks.

2 Answers 2

1

Functional solution:

The reduce() method executes a reducer function (that you provide) on each element of the array, resulting in single output value.

The reducer function takes four arguments: Accumulator, Current Value, Current Index and Source Array

More info see: MDN Web Docs - Reduce()

const arrayVal = [{
    "DATE": "2020-12-1",
    "NAME": "JAKE",
    "TEAM_NO": 2,
    
}, {
    "DATE": "2020-12-1",
    "NAME": "ANNA",
    "TEAM_NO": 2,
    
}, {
    "DATE": "2020-12-1",
    "NAME": "JEFF",
    "TEAM_NO": 1,
    
}, {
    "DATE": "2020-12-1",
    "NAME": "ERIKA",
    "TEAM_NO": 2,
   
}, {
    "DATE": "2020-12-1",
    "NAME": "SUTTON",
    "TEAM_NO": 3,
}, {
    "DATE": "2020-12-1",
    "NAME": "ARNOLD",
    "TEAM_NO": 3,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "JAKE",
    "TEAM_NO": 4,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "ANNA",
    "TEAM_NO": 2,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "JEFF",
    "TEAM_NO": 1,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "ERIKA",
    "TEAM_NO": 3,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "SUTTON",
    "TEAM_NO": 5,
     
}, {
    "DATE": "2020-12-2",
    "NAME": "ARNOLD",
    "TEAM_NO": 5,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "JAKE",
    "TEAM_NO": 1,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "ANNA",
    "TEAM_NO": 1,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "JEFF",
    "TEAM_NO": 1,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "ERIKA",
    "TEAM_NO": 2,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "SUTTON",
    "TEAM_NO": 3,
     
}, {
    "DATE": "2020-12-3",
    "NAME": "ARNOLD",
    "TEAM_NO": 3,
      
}];

const result = arrayVal.reduce((curr, entry) => {
    const {DATE, NAME, TEAM_NO} = entry;
  
  const newEntry = {DATE, TEAM_NO, "TEAM_NO_COUNT": 1};
    const currEntry = curr.find(currEntry => currEntry.DATE === DATE && currEntry.TEAM_NO === TEAM_NO);
  
  if(currEntry == null) {
    return [...curr, {...newEntry}];
  } else {
    return [
        ...curr.filter(currEntry => !(currEntry.DATE === DATE && currEntry.TEAM_NO === TEAM_NO)),
      {...newEntry, "TEAM_NO_COUNT": currEntry.TEAM_NO_COUNT + 1}
    ];
  }
}, []);

console.log(result);

With this direction your rebuild the entire array of objects. It's useful if you ever need to expand this data. For example, if you want to include a list of names of the players.

Sign up to request clarification or add additional context in comments.

1 Comment

Bonus: Version with names included: jsfiddle.net/ks0gvL3t
1

Find the solution below

const arrayVal = [{
    "DATE": "2020-12-1",
    "NAME": "JAKE",
    "TEAM_NO": 2,

}, {
    "DATE": "2020-12-1",
    "NAME": "ANNA",
    "TEAM_NO": 2,

}, {
    "DATE": "2020-12-1",
    "NAME": "JEFF",
    "TEAM_NO": 1,

}, {
    "DATE": "2020-12-1",
    "NAME": "ERIKA",
    "TEAM_NO": 2,

}, {
    "DATE": "2020-12-1",
    "NAME": "SUTTON",
    "TEAM_NO": 3,
}, {
    "DATE": "2020-12-1",
    "NAME": "ARNOLD",
    "TEAM_NO": 3,

}, {
    "DATE": "2020-12-2",
    "NAME": "JAKE",
    "TEAM_NO": 4,

}, {
    "DATE": "2020-12-2",
    "NAME": "ANNA",
    "TEAM_NO": 2,

}, {
    "DATE": "2020-12-2",
    "NAME": "JEFF",
    "TEAM_NO": 1,

}, {
    "DATE": "2020-12-2",
    "NAME": "ERIKA",
    "TEAM_NO": 3,

}, {
    "DATE": "2020-12-2",
    "NAME": "SUTTON",
    "TEAM_NO": 5,

}, {
    "DATE": "2020-12-2",
    "NAME": "ARNOLD",
    "TEAM_NO": 5,

}, {
    "DATE": "2020-12-3",
    "NAME": "JAKE",
    "TEAM_NO": 1,

}, {
    "DATE": "2020-12-3",
    "NAME": "ANNA",
    "TEAM_NO": 1,

}, {
    "DATE": "2020-12-3",
    "NAME": "JEFF",
    "TEAM_NO": 1,

}, {
    "DATE": "2020-12-3",
    "NAME": "ERIKA",
    "TEAM_NO": 2,

}, {
    "DATE": "2020-12-3",
    "NAME": "SUTTON",
    "TEAM_NO": 3,

}, {
    "DATE": "2020-12-3",
    "NAME": "ARNOLD",
    "TEAM_NO": 3,

}];

let finalArray = [];

arrayVal.forEach((x) => {
    if (finalArray.length == 0) {
        finalArray.push({
            DATE: x.DATE,
            TEAM_NO: x.TEAM_NO,
            TEAM_NO_COUNT: 1
        });
    } else {
        let indexI, flag = false;
        finalArray.forEach((i, index) => {

            if (x.TEAM_NO == i.TEAM_NO && x.DATE== i.DATE) {
                indexI = index;
                flag = true;
            }
        });
        if (!flag) {
            finalArray.push({
                DATE: x.DATE,
                TEAM_NO: x.TEAM_NO,
                TEAM_NO_COUNT: 1
            });
        } else {
            finalArray[indexI]["TEAM_NO_COUNT"] += 1;
        }
    }
});

console.log(finalArray);

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.