如何获得a和b之间的所有数字? (0 - 100)

问题描述

我有一个这样的对象数组:

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));