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
});
我正在尝试分离同一行中具有closeleft
值的标记。函数应比较行索引
中的所有左
值和接近的返回值(范围为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}
// ]
// ]