JS Frontend - Find the count of duplicates and append value in JavaScript Array List for multiple occurrences (C#)

95 Views Asked by At

I have an array list which has multiple properties in each array. Please refer to the example below:

FinalArray=[
{ColumnName:'Name',ID:6,TranslatedText:'Name',Category:'Assigned Employee'},
{ColumnName:'Name',ID:7,TranslatedText:'Name',Category:'Requested Employee'},
{ColumnName:'Designation',ID:8,TranslatedText:'Designation',Category:'Employee'},
{ColumnName:'Occupation',ID:9,TranslatedText:'Occupation',Category:'Assigned Employee'},
{ColumnName:'Occupation',ID:10,TranslatedText:'Occupation',Category:'Requested Employee'}
];

My task is to find out consecutive repeated elements (referring to translated text property from array list) and append "rep -" for all the occurrences. So the list would look like this in app:

Column Name Category
Rep - Name Assigned Employee
Rep - Name Requested Employee
Designation Employee
Rep - Occupation Assigned Employee
Rep - Occupation Requested Employee

I am stuck at comparing elements and appending values.

2

There are 2 best solutions below

0
On

You can accomplishes this using a Map, and looping the objects twice:

FinalArray=[
{ColumnName:'Name',ID:6,TranslatedText:'Name',Category:'Assigned Employee'},
{ColumnName:'Name',ID:7,TranslatedText:'Name',Category:'Requested Employee'},
{ColumnName:'Designation',ID:8,TranslatedText:'Designation',Category:'Employee'},
{ColumnName:'Occupation',ID:9,TranslatedText:'Occupation',Category:'Assigned Employee'},
{ColumnName:'Occupation',ID:10,TranslatedText:'Occupation',Category:'Requested Employee'}
];

let map = new Map();
FinalArray.forEach((obj)=>
{
  let count = map.get(obj.TranslatedText);
  if (count)
  {
    map.set(obj.TranslatedText, count + 1);
  }
  else
  {
    map.set(obj.TranslatedText, 1);
  }
});
FinalArray.forEach((obj)=>
{
  let count = map.get(obj.TranslatedText);
  if (count > 1)
  {
    obj.TranslatedText = "Rep - " + obj.TranslatedText;
  }

});
console.log(FinalArray);

But, this will prepend Rep - to all duplicates. If you only want consecutive duplicates only, this is ugly, but it works:

FinalArray=[
{ColumnName:'Name',ID:6,TranslatedText:'Name',Category:'Assigned Employee'},
{ColumnName:'Name',ID:7,TranslatedText:'Name',Category:'Requested Employee'},
{ColumnName:'Designation',ID:8,TranslatedText:'Designation',Category:'Employee'},
{ColumnName:'Occupation',ID:9,TranslatedText:'Occupation',Category:'Assigned Employee'},
{ColumnName:'Occupation',ID:10,TranslatedText:'Occupation',Category:'Requested Employee'}
];

let prevObj, foundOne;
FinalArray.push({}); // Removed later via pop(); it causes
                     // one additional iteration so that
                     // the orignial last-object gets processed
FinalArray.forEach((obj)=>
{
  if (prevObj && prevObj.TranslatedText === obj.TranslatedText)
  {
    foundOne = true;
    prevObj.TranslatedText = "Rep - " + prevObj.TranslatedText;
  }
  else
  {
    if (foundOne)
    {
      prevObj.TranslatedText = "Rep - " + prevObj.TranslatedText;
      foundOne = false;
    }
  }
  prevObj = obj;
});
FinalArray.pop();

console.log(FinalArray);

0
On

Here is a different approach which is using map function on the array:

let FinalArray=[
{ColumnName:'Name',ID:6,TranslatedText:'Name',Category:'Assigned Employee'},
{ColumnName:'Name',ID:7,TranslatedText:'Name',Category:'Requested Employee'},
{ColumnName:'Designation',ID:8,TranslatedText:'Designation',Category:'Employee'},
{ColumnName:'Occupation',ID:9,TranslatedText:'Occupation',Category:'Assigned Employee'},
{ColumnName:'Occupation',ID:10,TranslatedText:'Occupation',Category:'Requested Employee'}
];

const key = 'ColumnName', prefix = 'Rep - ';

FinalArray.map((column, index, array) => {
        if(index > 0 && array[index-1][key] === column[key]) {
      array[index-1][key] = prefix + column[key];
      array[index][key] = prefix + column[key];
    }
 
})

console.table(FinalArray);