在数组

时间:2016-10-08 09:04:51

标签: javascript ecmascript-6 lodash

我试图找到一个数组中的所有值,这些值将形成一个递增值链 - 所有值都会返回到某个起始值。增量可以同时增加" up"和" down"。

array = [10, 2, 3, 5, 9, 11]

从数字2开始应返回:

[2, 3]

从数字10开始应返回:

[9, 10, 11]

当然有很多效率低下的方法,但我在这里问这个问题,因为有效地做这件事对我的情况非常重要,我就是这样一个JS新手。

4 个答案:

答案 0 :(得分:2)

您可以使用Array.prototype.includes()检查数组中是否存在数字。如果数字在基准引用之前,请使用unshift添加,如果在使用push添加之后:

var array = [10, 2, 3, 5, 9, 11];

function findChain(array, num) {
  if(!array.includes(num)) {
    return [];
  }
  
  const result = [num];
  let before = num - 1;
  let after = num + 1;
  
  while(array.includes(before)) {
    result.unshift(before--);
  }
  
  while(array.includes(after)) {
    result.push(after++);
  }
  
  return result;
}

console.log('Ref 2 -', findChain(array, 2));

console.log('Ref 5 -', findChain(array, 5));

console.log('Ref 10 -', findChain(array, 10));

console.log('Ref 20 -', findChain(array, 20));

答案 1 :(得分:1)

快速解决方案:

var array = [10, 2, 3, 5, 9, 11, 14, 89, 12, 8];

var trouver = nombre => {
  var result = [];
  if (array.indexOf(nombre) !== -1) result.push(nombre);
  else return result;
  for(var chiffre = nombre+1; array.indexOf(chiffre) !== -1; chiffre++) result.push(chiffre);
  for(var chiffre = nombre-1; array.indexOf(chiffre) !== -1; chiffre--) result.push(chiffre);
  return result.sort((a,b) => a-b);
}

console.log(trouver(9)); //[ 8, 9, 10, 11, 12 ]

答案 2 :(得分:1)

另一个解决方案可能是双链表。



function getValues(array, value) {
    var object = Object.create(null),
        result,
        o;
    array.forEach(function (a) {
        object[a] = object[a] || { value: a, pre: object[a - 1] || null, succ: object[a + 1] || null };
        if (object[a - 1]) {
            object[a - 1].succ = object[a];
        }
        if (object[a + 1]) {
            object[a + 1].pre = object[a];
        }
    });
    o = object[value];
    if (o) {
        result = [];
        while (o.pre) {
            o = o.pre;
        }
        while (o.succ) {
            result.push(o.value);
            o = o.succ;
        }
        result.push(o.value);
    }
    return result;
}

var array = [10, 2, 3, 5, 9, 11, 14, 89, 12, 8];

console.log(getValues(array, 2));
console.log(getValues(array, 10));
console.log(getValues(array, 42));

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 3 :(得分:1)

尝试这种方法

  1. 先排序数组
  2. 逐个迭代数组项,如果 current-item 值不大于 last-item ,则继续推送启动计数器 1 ,否则将start-counter重置为当前索引
  3. 例如:

     var arr = [10, 2, 3, 5, 9, 11];
    
     function getAllSequences(arr) {
       arr.sort(function(a, b) {
         return a - b
       });
    
       var startIndex = 0;
       var endIndex = 0;
       var lastItem = 0;
       var chains = [];
       arr.forEach(function(item, index) {
         if (index > 0) {
           if ((item - lastItem) > 1) {
             extractChain(chains, arr, startIndex, endIndex);
             startIndex = index;
           } else {
             endIndex = index;
             if (index == arr.length - 1) {
               extractChain(chains, arr, startIndex, endIndex);
             }
           }
         }
         lastItem = item;
       });
       return chains;
     }
    
    
    
     console.log(getAllSequences(arr));
    
     function extractChain(chains, arr, startIndex, endIndex) {
       var value = arr.slice(startIndex, endIndex + 1);
       if (value.length > 0) {
         chains.push(value);
       }
     }