Javascript 是否检测数组中接近且索引值相同的数字?

Javascript 是否检测数组中接近且索引值相同的数字?,javascript,jquery,html,css,each,Javascript,Jquery,Html,Css,Each,我有一个复杂的时间轴,它有很多不同位置的标签,如果日期很近,标签就会重叠。需要分离重叠的标签 我有rowIndex值,它指示行中对齐的标记: ---标签------标签------标签-----------(行) --------标记--标记--标记--标记--标记-(行) 我有tagIndex值,可以在当前行中将它们彼此分开 最后一个值是left。此值定义当前标记的位置 数组如下所示: var tagsPosiArr = [ {left: "8%", rowIndex: 0, tagI

我有一个复杂的时间轴,它有很多不同位置的标签,如果日期很近,标签就会重叠。需要分离重叠的标签

我有
rowIndex
值,它指示行中对齐的标记:

---标签------标签------标签-----------(行)

--------标记--标记--标记--标记--标记-(行)

我有
tagIndex
值,可以在当前行中将它们彼此分开

最后一个值是
left
。此值定义当前标记的位置

数组如下所示:

var tagsPosiArr = [
    {left: "8%", rowIndex: 0, tagIndex: 0},
    {left: "40%", rowIndex: 0, tagIndex: 1},
    {left: "92%", rowIndex: 0, tagIndex: 2},
    {left: "10%", rowIndex: 10, tagIndex: 0},//here
    {left: "11%", rowIndex: 10, tagIndex: 1},//here
    {left: "11%", rowIndex: 10, tagIndex: 2},//here
    {left: "12%", rowIndex: 10, tagIndex: 3},//here
    {left: "40%", rowIndex: 10, tagIndex: 4},
    {left: "8%", rowIndex: 17, tagIndex: 0},
    {left: "10%", rowIndex: 17, tagIndex: 1},//here
    {left: "92%", rowIndex: 17, tagIndex: 2}//here
];

$.each(tagsPosiArr,function (index) {
    console.log(this);
    //console.log(this.rowIndex);
    //Function should compare all of `left` values in `rowIndex` and return values which are close (in range of 16).
    // vales are highlated with "// here" text
});
我正在尝试分离同一行中具有close
left
值的标记。函数应比较
行索引
中的所有
值和接近的返回值(范围为16)

我当前的限制是
16%
我需要检测这些标签

  • 塔加,左=0%
  • tagB,左=15%
这些是好的:

  • 塔加,左=0%
  • tagB,左=30%
  • tagC,左=80%
,我被绊倒了,任何想法都会被感激的

注意:我不能展示整个作品,我希望这足够了。

试试看

var tagsPosiArr=[
{左:“8%”,行索引:0,标记索引:0},
{左:“40%”,行索引:0,标记索引:1},
{左:“92%”,行索引:0,标记索引:2},
{左:“10%”,行索引:10,标记索引:0},
{左:“40%”,行索引:10,标记索引:1},
{左:“8%”,行索引:17,标记索引:0},
{左:“10%”,行索引:17,标记索引:1},
{左:“92%”,行索引:17,标记索引:2}
];
var filtered=$.grep(tagsPosiArr,函数(值,索引){
返回(parseInt(value.left)尝试以下操作:

tagsPosiArr.sort(function (lhs, rhs) {
    return lhs.rowIndex > rhs.rowIndex ? 1 : lhs.rowIndex < rhs.rowIndex ? -1 : parseInt(lhs.left) > parseInt(rhs.left) ? 1 : parseInt(lhs.left) < parseInt(rhs.left) ? -1 : 0;
});

var min = 16;

var prev;
var match = 0;

var overlapping = [];
var overlappingId = 0;
$.each(tagsPosiArr, function (index) {

    if (prev != undefined && this.rowIndex == prev.rowIndex && parseInt(this.left) - parseInt(prev.left) < min) {
        if(match === 0){
            overlapping[overlappingId] = [prev];
        }
        overlapping[overlappingId].push(this);
        ++match;        
    } else{
        if(match != 0){
            match = 0;
            ++overlappingId;
        }
    }
    prev = this;
});

console.log(overlapping);

//=>
// [
//   [
//     {left: "10%", rowIndex: 10, tagIndex: 0},
//     {left: "11%", rowIndex: 10, tagIndex: 1},
//     {left: "11%", rowIndex: 10, tagIndex: 2},
//     {left: "12%", rowIndex: 10, tagIndex: 3}
//   ],
//   [
//     {left: "8%", rowIndex: 17, tagIndex: 0},
//     {left: "10%", rowIndex: 17, tagIndex: 1}
//   ]
// ]
tagsPosiArr.sort(函数(左、右){
返回lhs.rowIndex>rhs.rowIndex?1:lhs.rowIndexparseInt(rhs.left)?1:parseInt(lhs.left)
// [
//   [
//{左:“10%”,行索引:10,标记索引:0},
//{左:“11%”,行索引:10,标记索引:1},
//{左:“11%”,行索引:10,标记索引:2},
//{左:“12%”,行索引:10,标记索引:3}
//   ],
//   [
//{左:“8%”,行索引:17,标记索引:0},
//{左:“10%”,行索引:17,标记索引:1}
//   ]
// ]

演示:

你被困在哪里了?你的JSFIDLE和你的问题都没有表现出任何解决问题的努力it@A.Wolff我无法检测要测量的上一个、当前和下一个值,需要检测16%的范围。我可以获取值,但在公式/:是过滤
tagsPosiArr
中具有
左属性的项目的要求rty值小于或等于
16%
?不确定
0%、30%、80%
是否也“正常”?Thanks@guest271314它应该比较rowIndex中的所有左值,并返回接近的值(范围为16)
left:92%,rowIndex:17
在编辑的post/jsfiddle中标记为“here”,尽管看起来大于“16”范围?另外,
{left:“8%”,行索引:17,标记索引:0}
未标记“此处”,但范围显示在“16”内?非常感谢它看起来很完美,但它返回的是错误的/:它返回8%和10%,但如果你查看它们的rowIndex,你会发现它们没有接近的值。但是rowIndex 17的值返回true。如果你检查这个示例,你会看到它返回的rowIndex 0,而该行中没有目标值/:但是我希望你的方法也非常棒你会解决这个问题的,再次非常感谢。非常感谢你的努力+1这看起来很完美,看起来很接近但仍然不完整,看看我准备的小提琴。它应该在第10行返回4个值,但它返回2个值。非常感谢,这就是我的目标+1。
tagsPosiArr.sort(function (lhs, rhs) {
    return lhs.rowIndex > rhs.rowIndex ? 1 : lhs.rowIndex < rhs.rowIndex ? -1 : parseInt(lhs.left) > parseInt(rhs.left) ? 1 : parseInt(lhs.left) < parseInt(rhs.left) ? -1 : 0;
});

var min = 16;

var prev;
var match = 0;

var overlapping = [];
var overlappingId = 0;
$.each(tagsPosiArr, function (index) {

    if (prev != undefined && this.rowIndex == prev.rowIndex && parseInt(this.left) - parseInt(prev.left) < min) {
        if(match === 0){
            overlapping[overlappingId] = [prev];
        }
        overlapping[overlappingId].push(this);
        ++match;        
    } else{
        if(match != 0){
            match = 0;
            ++overlappingId;
        }
    }
    prev = this;
});

console.log(overlapping);

//=>
// [
//   [
//     {left: "10%", rowIndex: 10, tagIndex: 0},
//     {left: "11%", rowIndex: 10, tagIndex: 1},
//     {left: "11%", rowIndex: 10, tagIndex: 2},
//     {left: "12%", rowIndex: 10, tagIndex: 3}
//   ],
//   [
//     {left: "8%", rowIndex: 17, tagIndex: 0},
//     {left: "10%", rowIndex: 17, tagIndex: 1}
//   ]
// ]