从Javascript对象数组中的重复项创建唯一值

从Javascript对象数组中的重复项创建唯一值,javascript,array-map,Javascript,Array Map,我有一个Javascript中的重复对象数组。我想通过添加单个值的出现索引来创建唯一对象的数组 这是我的初始数据: const array= [ {name:"A"}, {name:"A"}, {name:"A"}, {name:"B"}, {name:"B"}, {name:"C"}, {name:"C"}, ]; 这是预期的

我有一个Javascript中的重复对象数组。我想通过添加单个值的出现索引来创建唯一对象的数组

这是我的初始数据:

const array= [
  {name:"A"},
  {name:"A"},
  {name:"A"},
  {name:"B"},
  {name:"B"},
  {name:"C"},
  {name:"C"},
];
这是预期的最终结果:

const array= [
  {name:"A-0"},
  {name:"A-1"},
  {name:"A-2"},
  {name:"B-0"},
  {name:"B-1"},
  {name:"C-0"},
  {name:"C-1"},
];
我觉得这应该是相当简单的,但有一段时间被卡住了。你能告诉我怎么做吗?如果可能的话,我需要它的效率,因为阵列最多可以容纳1000个项目


编辑:这是我的解决方案,但我觉得不是很有效

const array = [
  { name: "A" },
  { name: "A" },
  { name: "C" },
  { name: "B" },
  { name: "A" },
  { name: "C" },
  { name: "B" },
];

const sortedArray = _.sortBy(array, 'name');

let previousItem = {
   name: '',
   counter: 0
};
const indexedArray = sortedArray.map((item) => {
  if (item.name === previousItem.name) {
    previousItem.counter += 1;
    const name = `${item.name}-${previousItem.counter}`;
    return { name };
  } else {
    previousItem = { name: item.name, counter: 0};
    return item;
  }
});

保留计数器,如果当前名称更改,请重置计数器

此版本会对对象进行变异。不确定你是否想要一份。您可以首先按对象名对数组进行排序,以确保它们是有序的(如果这还不是现有的先决条件)

const数组=[
{name:“A”},
{name:“A”},
{name:“A”},
{name:“B”},
{name:“B”},
{name:“C”},
{name:“C”},
];
名称、索引;
for(让我进入数组){
index=array[i].name==name?index+1:0;
名称=数组[i]。名称;
数组[i].name+=`-${index}`;
}

console.log(数组)保留计数器,如果当前名称更改,请重置计数器

此版本会对对象进行变异。不确定你是否想要一份。您可以首先按对象名对数组进行排序,以确保它们是有序的(如果这还不是现有的先决条件)

const数组=[
{name:“A”},
{name:“A”},
{name:“A”},
{name:“B”},
{name:“B”},
{name:“C”},
{name:“C”},
];
名称、索引;
for(让我进入数组){
index=array[i].name==name?index+1:0;
名称=数组[i]。名称;
数组[i].name+=`-${index}`;
}

console.log(数组)目前,您正在先对其排序,然后在其上循环,这可能不是最有效的解决方案

我建议你在上面画一个帮助对象

const a=[{name:“a”},{name:“a”},{name:“a”},{name:“B”},{name:“C”},{name:“C”},o={};
常量r=a.map({name})=>{
o[name]=“number”?o[name]+:o[name]=0;
返回{name:`${name}-${o[name]}`};
});

控制台日志(r)目前,您正在先对其排序,然后在其上循环,这可能不是最有效的解决方案

我建议你在上面画一个帮助对象

const a=[{name:“a”},{name:“a”},{name:“a”},{name:“B”},{name:“C”},{name:“C”},o={};
常量r=a.map({name})=>{
o[name]=“number”?o[name]+:o[name]=0;
返回{name:`${name}-${o[name]}`};
});

控制台日志(r)你得到了什么结果?显示您被卡住的位置。如果它们是这样排序的,那么只需使用计数器变量,跟踪当前信件,然后在收到新信件时重置计数器即可。以编辑方式发布我的解决方案。谢谢,相反的想法帮助我解决了这个问题你得到了什么结果?显示您被卡住的位置。如果它们是这样排序的,那么只需使用计数器变量,跟踪当前信件,然后在收到新信件时重置计数器即可。以编辑方式发布我的解决方案。谢谢,相反的想法帮助我解决了这个问题。我接受了你的答案,认为这是最好的解决方案,因为jsbench显示它是最快的。我要把它分解,以了解你是如何使用帮助对象的。谢谢@mhlavacka帮助对象基本上存储了特定的
name
已经循环了多少次的信息。我接受你的答案作为最佳解决方案,因为jsbench显示它是最快的。我要把它分解,以了解你是如何使用帮助对象的。谢谢@mhlavacka帮助对象基本上存储特定
name
已循环多少次的信息。