问题描述
let arr = [{start: 0,end: 50,id: '55'},{start: 51,end: 100,id: '66'}];
我还有一个字符串,例如在这种情况下我们有一个长度为 100
的字符串;
所以当我点击字符串中的某个位置时,我可以获得插入符号位置:
const range = window.getSelection()?.getRangeAt(0);
const preCaretRange = range?.cloneRange();
preCaretRange?.selectNodeContents(element);
caretCharOffset = preCaretRange?.toString().length || 0;
我的目标 - 当我点击字符串中的某个位置时获取对象的 id。
这意味着当我点击 33
索引时 - 我会得到 id 55
,当我点击 87
索引时,我会得到 id {{1}等我怎么做,有人可以帮我吗?
解决方法
如果位置匹配的范围可以有多个,您可以使用例如reduce并检查值是否大于或等于起始值,以及小于或等于结束值。
然后聚合 id 属性的值。
let arr = [{start: 0,end: 50,id: '55'},{start: 51,end: 100,id: '66'}];
const getObjectId = pos => {
return arr.reduce((a,c) => {
if (pos >= c.start && pos <= c.end) {
a.push(c.id);
}
return a;
},[]);
}
console.log(getObjectId(33));
console.log(getObjectId(87));
如果只有一个可能的返回值,例如可以使用 for 循环并在第一次匹配时返回值。
let arr = [{start: 0,id: '66'}];
const getObjectId = pos => {
for (let i = 0; i <= arr.length; i++) {
let p = arr[i];
if (pos >= p.start && pos <= p.end) {
return p.id;
}
}
}
console.log(getObjectId(33));
console.log(getObjectId(87));