我正在努力解决一个简单的模式:
['A1', 'A2', 'A5', 'E1', 'E4', 'E6']
我想填写每个字母数字范围之间的数字间隙(就地或另一个数组)
模式是1个字母与大于1的整数连接(如果你觉得任何数量的字母都可以随意使用)
所以这个例子数组会产生以下结果:
['A1', 'A2', 'A3', 'A4', 'A5', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6']
我正在寻找最直接/最有效的方式,ES6也欢迎
答案 0 :(得分:3)
您可以迭代一次数组以收集以下信息:
在您的示例中,在第一次迭代后,我们将知道有两个alpha:
现在,您可以生成答案。
<强>演示:强>
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;
此解决方案有许多地方需要改进或缩短,这取决于您的ECMASript版本限制,但它显示了这个想法。
我还假设这种格式始终是保证的:{alpha part}{numeric part}
。如果不是,那么它也需要改进。
答案 1 :(得分:1)
您可以使用reduce
方法执行此操作。
此外,通过传递replace
模式来使用regex
方法,以便从text
E1
或E
中找出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']
获取Alpha-Part
查找最大数字 - 该Alpha的一部分
获取&#34; A5&#34;的字典输入 - &GT;返回['A1', 'A2', 'A3', 'A4', 'A5']
concat all dictionary-returns
应该是最快的方式。耗费更多内存。必须先创建词典。 预计有限的最大数字部分。
答案 3 :(得分:0)
试试这个:
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;
即使是乱序元素也能正常工作
答案 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]