【问题标题】:How to test whether array index is between arbitrary end and start point?如何测试数组索引是否在任意终点和起点之间?
【发布时间】:2016-06-17 15:43:14
【问题描述】:

编辑:4 年后,我认为这是我提出的一个不好的问题。我希望它对某人有用,但我认为它是一个很好的删除候选者。继续撒盐。

假设我有一个数组,并且某个函数遍历该数组的子数组。此外,如果子数组包含超出数组末尾的索引,则子数组从数组的第一个索引处恢复

例如,如果数组长度为 50,并且索引从 0 开始,

48 49 0 1 ...

特别是,我使用 JavaScript 的 Remainder 运算符来从头到尾。 array[i%array.length].

虽然这为我提供了我想要的连续索引集,但我还想根据索引值进行一些过滤,如果它们超出某个点,我想排除它们。例如,只保留“介于”48 和 1 之间的索引;开始包容,结束排斥。

我一直在做的只是在item.index >= idx && item.index < end 之类的条件上进行过滤,但这显然不适用于数组的开头和结尾。

那么,正如标题所述,如何有效地检查给定索引或一组索引是否在这些点之间?

就本题而言,起点是包容的,终点是排斥的。

编辑:作为对反对票的回应,我已经澄清了这个问题并添加了几个 sn-ps。为简洁起见,我省略了问题的每个细节。

【问题讨论】:

  • 一个元素位于其他两个元素之间是什么意思?
  • 你说的方式,任何点都在任何其他点之间,因为每个点都可以稍后再次出现。
  • 这不会造成无限循环吗?也许您应该解释为什么需要这样做。
  • 研究使用模运算作为起点。这样想起来就容易多了
  • 请在您的问题中提供MCVE。完整性比简洁更重要。

标签: javascript arrays performance


【解决方案1】:

类似的东西应该可以工作

function checkPresence(arr, start, stop, value){
  if (arr.slice(arr.indexOf(start), arr.indexOf(stop)).indexOf(value) != -1)
    return true;
  else return false;
}

var tab = [12, 2, 36, 14, 48, 49, 0, 1];
console.log(checkPresence(tab, 48, 1, 49));

【讨论】:

  • 我将项目的索引与源数组的索引进行比较。您正在查看indexOf numbers 49、48 和 1...但在我的情况下,这些是索引,1 永远不会超过 49 或 48。
  • 你能写出你原来的数组和一个子数组的例子吗?因为对我来说,数组是一系列可通过索引访问的值。
【解决方案2】:

如果没有其他条件,这将是一个无限循环,但它是如何完成的:

for (var i = 1; someCondition; i++) {
    if (i >= array.length - 1) {
        i = 1;
    }
    // some code
}

【讨论】:

  • 是的,我可以按照这些思路做一些事情,但它不是很优雅。
  • 你觉得for (var i = 0; condition; i = i >= array.length ? 0 : i + 1)更优雅吗?您也可以将i = (i + 1) % array.length 用于递增部分,但这比您需要的数学要多,而且性能较差。
  • 我对我的答案进行了编辑,这样它就不会遍历开始和结束索引。
  • 如果您仍想使用模数,但需要性能,请参阅this article,它显示了模数的更快替代方案。
【解决方案3】:

建议的答案是正确的方向,但并没有完全实现。我的问题很难说清楚,所以我不怪他们。

对于未来的访问者,下面是实现我所想的代码。

Plunkr demo

/* source array */
var source = [];

for (var i = 0; i < 10; i++) {
    source.push({ index: i });
}

/* target array */
var target = [];

/* initial index reference in the array; bound between 0 and length-1 */
var index = 0;

/* count of items to be 'displayed', or allocated to the subarray; with index = 0, items 0,1,2,3 will be in the subarray */
var show = 3;

/* init target */

target = source.slice(index,show);

/* specifies count of items to be replaced when updating the subarray */
var increment = 1;

var iterator = [1,2,3,4,5,6,7,8,9];

iterator.forEach(function(item,i) {
    slide(increment);
});

console.log('first index should be at index: ' + iterator.length, 'actual index is: ', target[0].index);
console.log('last index should be at index: ' + (iterator.length + show - 1)%source.length, 'actual index is: ', target[target.length-1].index);

function slide(by) {

      if (!by) {
        by = 1;
      }

      var len = source.length;
      var idx;

      if (index + by < 0) {
        idx = len - Math.abs(by);
      } else if (index + by >= len) {
        idx = by;
      } else {
        idx = index + by;
      }

      var start = idx + show;

      var i;
      var j;

      for (i = idx, j = 0; i < start; i++, j++) {

        var loc = target.indexOf(source[i%len]);

        if (loc >= 0) {
          target[loc] = { index: null };
        }

        target[j] = source[i%len];
      }

      index = (idx) > len ? idx-len : idx;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多