填补字母数字数组元素之间的差距

时间:2017-10-18 07:28:36

标签: javascript arrays sorting ecmascript-6

我正在努力解决一个简单的模式:

['A1', 'A2', 'A5', 'E1', 'E4', 'E6']

我想填写每个字母数字范围之间的数字间隙(就地或另一个数组)

模式是1个字母与大于1的整数连接(如果你觉得任何数量的字母都可以随意使用)

所以这个例子数组会产生以下结果:

['A1', 'A2', 'A3', 'A4', 'A5', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6']

我正在寻找最直接/最有效的方式,ES6也欢迎

6 个答案:

答案 0 :(得分:3)

您可以迭代一次数组以收集以下信息:

  • 你有什么alpha部分
  • 每个alpha部分的左右(最小和最大)边界是什么

在您的示例中,在第一次迭代后,我们将知道有两个alpha:

  • A,从1开始,最多5
  • E,从1开始到6

现在,您可以生成答案。

<强>演示:

&#13;
&#13;
var sourceYours = ['A1', 'A2', 'A5', 'E1', 'E4', 'E6']
var sourceComplex = ['A1', 'A2', 'A5', 'E1', 'E4', 'E6', 'D2', 'D4', 'E7'];

console.log(fillGaps(sourceYours));
console.log(fillGaps(sourceComplex));

function fillGaps(arr) {
  var alphas = {};
  
  arr.forEach(function(x) {
    var alpha = x.replace(/\d/, ""), 
        numeric = +x.replace(/\D/, "");
    
    if (!alphas[alpha]) {
      alphas[alpha] = {
        min: numeric,
        max: numeric
      };
    } else {
      alphas[alpha].min = Math.min(alphas[alpha].min, numeric);
      alphas[alpha].max = Math.max(alphas[alpha].max, numeric);
    }    
  });
  
  var result = [];
  for (var alpha in alphas)
  {
    for (var num = alphas[alpha].min; num <= alphas[alpha].max; num++)
    {
      result.push(alpha + num);
    }
  }
  
  return result;
}
&#13;
&#13;
&#13;

此解决方案有许多地方需要改进或缩短,这取决于您的ECMASript版本限制,但它显示了这个想法。
我还假设这种格式始终是保证的:{alpha part}{numeric part}。如果不是,那么它也需要改进。

答案 1 :(得分:1)

您可以使用reduce方法执行此操作。

此外,通过传递replace模式来使用regex方法,以便从text E1E中找出number这是1

我们的想法是从您的给定数组中查找两个元素consecutive,并使用for 循环添加缺少的元素。

let array=['A1', 'A2', 'A5', 'E1', 'E4', 'E6']
array = array.reduce(function(arr,item,i){
  if(i>0){
    var [elemNr,elemStr]=[item.replace( /\D+/g, ''),item.replace(/[0-9]/g, '')];
    var [lastElemNr, lastElemStr]=[array[i-1].replace( /\D+/g, ''),array[i-1].replace(/[0-9]/g, '')];
    for(j=lastElemNr;j<=elemNr;j++) 
       if(arr.indexOf(elemStr+j)==-1)
          arr.push(elemStr+j);
  }
  return arr;
},[]);
console.log(array);

答案 2 :(得分:1)

如果数字有最大值,你也可以考虑Hash-Map / Table(例如Dictionary)。

var sourceYours = ['A1', 'A2', 'A5', 'E1', 'E4', 'E6']
  1. 获取Alpha-Part

  2. 查找最大数字 - 该Alpha的一部分

  3. 获取&#34; A5&#34;的字典输入 - &GT;返回['A1', 'A2', 'A3', 'A4', 'A5']

  4. concat all dictionary-returns

  5. 应该是最快的方式。耗费更多内存。必须先创建词典。 预计有限的最大数字部分。

答案 3 :(得分:0)

试试这个:

&#13;
&#13;
function fill(theArray){
  theArray = theArray.sort().reverse();
  var newList = [];
  for (let el of theArray) {
    let newListLenght = newList.length;
    if (!newListLenght || newList[newListLenght-1].charAt(0) !== el.charAt(0)){
      let maxNumber = parseInt(el.charAt(1));
      for (let number = 1; number < maxNumber; number ++){
        newList.push(el.charAt(0) + number);
      }
    }
  };
  return newList.sort();
}
&#13;
&#13;
&#13;

即使是乱序元素也能正常工作

答案 4 :(得分:0)

你可以使用Array#reduce,在那里查看给定数组的两个元素,并在计数时用while循环填充缺少的部分。

var array = ['Z0', 'A1', 'A2', 'A5', 'B4','E1', 'E4', 'E6', 'G2'],
    result = [];

array.reduce(function (a, b) {
    var aa = (a || b).match(/(\D+)(\d+)/).slice(1),
        bb = b.match(/(\D+)(\d+)/).slice(1);

    if (aa[0] === bb[0]) {
        while (++aa[1] < bb[1]) {
            result.push(aa.join(''));
        }
    }
    result.push(b);
    return b;
}, undefined);

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

答案 5 :(得分:0)

您可以循环原始数组,然后比较值是否连续。如果不是,您可以使用循环填充该差异。

例如:

var result = [];
var arr = ['A1', 'A2', 'A5', 'E1', 'E4', 'E6'];
arr.sort();

for (var i = 0; i < arr.length; i++) {
    var curr = arr[i];
    result.push(curr);
    if (arr[i + 1]) {
        var next = arr[i + 1];
        if (curr.charAt(1) < next.charAt(1)) {
            for (var y = parseInt(curr.charAt(1), 10) + 1 ; y < parseInt(next.charAt(1)); y++) {
                result.push(next.charAt(0) + y);
            }
        }

    }
}
console.log(result);

将导致:

  

[&#34; A1&#34;,&#34; A2&#34;,&#34; A3&#34;,&#34; A4&#34;,&#34; A5&#34;,& #34; E1&#34;,&#34; E2&#34;,&#34; E3&#34;,&#34; E4&#34;,&#34; E5&#34;,&#34; E6&# 34]