0

我有一个数组列表,每个数组中有多个属性。请参考以下示例:

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 -”。所以列表在应用程序中看起来像这样:

列名 类别
代表 - 名称 指定员工
代表 - 名称 要求的员工
指定 员工
代表 - 职业 指定员工
代表 - 职业 要求的员工

我一直在比较元素和附加值。

4

2 回答 2

1

您可以使用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);

于 2021-09-27T08:04:12.207 回答
0

这是在数组上使用 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);
于 2021-09-29T10:49:48.213 回答