JS Frontend -查找重复的计数,并在JavaScript数组列表中添加多次出现的值(c#)



我有一个数组列表,在每个数组中有多个属性。请参考下面的例子:

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'}
];

我的任务是找出连续重复的元素(参考数组列表中的翻译文本属性)并附加"rep -"对于所有的事件。所以这个列表在app:

中是这样的
类别th>分配员工要求员工分配员工要求员工

您可以使用Map实现这一点,并循环两次对象:

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

但是,这将把Rep -添加到所有副本中。如果您只想要连续的副本,这是丑陋的,但它可以工作:

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

这里有一种不同的方法,即在数组上使用map函数:

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

最新更新