JavaScript确保所有数字都是唯一的,如果不是加上一个(或多个)

JavaScript确保所有数字都是唯一的,如果不是加上一个(或多个),javascript,algorithm,d3.js,duplicates,Javascript,Algorithm,D3.js,Duplicates,我想在d3图表上贴上一些标签 我有一个DATA对象,每个对象都有一个DATA.rowOffset值。基本上,我的代码计算DATA.rowOffset并如下设置:d.rowOffset=Math.floor(d.total/heightSquares)但有时行偏移量是相同的,因此标签呈现在彼此的顶部 我需要循环查看此数据,检查是否存在重复项,然后只需+1任何重复项 我尝试了一种方法,查看了前面的.rowOffset,然后将1添加到当前的rowOffset,但如果重复项超过2个,则该方法无效 我相信

我想在d3图表上贴上一些标签

我有一个
DATA
对象,每个对象都有一个
DATA.rowOffset
值。基本上,我的代码计算
DATA.rowOffset
并如下设置:
d.rowOffset=Math.floor(d.total/heightSquares)
但有时
行偏移量
是相同的,因此标签呈现在彼此的顶部

我需要循环查看此
数据
,检查是否存在重复项,然后只需+1任何重复项

我尝试了一种方法,查看了前面的
.rowOffset
,然后将1添加到当前的
rowOffset
,但如果重复项超过2个,则该方法无效

我相信有更简单的方法。。。。也许吧

编辑:这里有一些我主要尝试的代码
if(d.rowOffset===DATA[I-1].rowOffset)d.rowOffset++因此它检查上一行偏移量。我想我需要循环浏览所有数据,然后在发现重复数据时重新开始循环

DATA.forEach(function(d, i) {
      d.amt = +d.amt;

      d.units = Math.floor(d.amt / squareValue);

      sumTotal = sumTotal + d.units;
      d.total = sumTotal;



      d.rowOffset = Math.floor(d.total / heightSquares);

      if (i > 0) {
        console.log(DATA[i - 1].rowOffset);
        if (d.rowOffset === DATA[i - 1].rowOffset) d.rowOffset++;
      }

这里有一个方法你可以采取

您可以初始化一个空数据结构,以跟踪到目前为止遇到的唯一值。遍历数组,并对每个值执行以下操作:

  • 如果以前遇到过该值,则递增该值,直到它与以前遇到的任何值都不匹配为止
  • 更新遇到的值以包含此新值
  • 用新值替换旧值
下面是代码中的情况:

函数递增DUPS(arr){
//一组遇到的唯一值
常量=新集合();
//递增每个副本,直到没有副本
返回arr.map(num=>{
while(遭遇.has(num)){
num+=1;
}
添加(num);
返回num;
});
}
console.log(
递增重复(
[1, 2, 2, 3, 2, 2, 4] // [1, 2, 3, 4, 5, 6, 7]
)
);
console.log(
递增重复(
[1, 1, 1, 1, 1, 1, 1] // [1, 2, 3, 4, 5, 6, 7]
)
);
console.log(
递增重复(
[1, 99, 55, 4, 55, 2] // [1, 99, 55, 4, 56, 2]
)

);那么如果你有
[2,2,2]
?您是否希望
[2,3,3]
[2,3,4]
?[2,3,4]因此所有值都是唯一的,如果它们尝试在同一行上,标签只是堆叠在彼此下方。谢谢你展示了你尝试过的方法的代码?@phocks好的,这实际上给你的问题增加了一层复杂性,因为每一个增加的重复都可能成为另一个数字的重复,这必须加以说明。我添加了一个可能的解决方案,希望能有所帮助。