我想按字母顺序生成唯一的字母键 | AngularJS

3

我希望以字母顺序生成密钥,以以下方式开始:

aaaaa

然后下一个应该是aaaab,并在达到aaaaz后变为aaaba,然后变成aaabb,以此类推,以便正确生成密钥。

我的示例 JSON 如下:

 var keygen={aaaaa,
             aaaab,
             aaaac .........aaaaz,aaaba ....}

我的 JavaScript

$scope.doKeyGen=function(lastValueInJSON)
                {  // Do something 
                   }

lastValueInJson 是什么? - Jins Peter
@JinsPeter,无论JSON中的最后一个值是什么,我的意思是…… - Vibhor
你需要一个递归函数吗? - JeanJacques
@JeanJacques会很好。 - Vibhor
@Vibhor,你能给我们投一票吗? - Jins Peter
显示剩余6条评论
3个回答

1
你需要使用递归函数来生成你的键值。 我已经在这个 fiddle链接 中编写了一些代码,根据你的要求生成键并创建JSON。
请注意,我假设只有小写字母键,并使用3个长度的字符串(aaa),你也可以使用4个长度,但性能会降低。
你可以更改附带fiddle中输入的任何第一个键,比如'aay',然后代码将生成所有可能的下一个键。(aaz、aba、...、zzz)。

你好@anoop,最近我收到了一个请求,要求只更改一个元素,所以基本上如果我给aaa,它会变成aab并将aab推送到JSON中,我尝试编辑你的jsfiddle但无法成功,你能帮忙吗? - Vibhor
@Vibhor:我不太了解你的新需求,但当然你可以在新密钥创建后立即推送。请查看此更新的fiddle,我只是记录了JSON并注释了其他密钥生成代码。希望能有所帮助。 - anoop

1
你可以使用这个。

function getNextKey(lastKeyCode, changeIndex)
{
  var charCodes = [];
  if( changeIndex == undefined )
      changeIndex = lastKeyCode.length - 1;


  if(changeIndex - 1 > -1 && lastKeyCode.charCodeAt(changeIndex) == 122 )
  {
     lastKeyCode = getNextKey(lastKeyCode, changeIndex - 1);
  }

  lastKeyCode.split('').forEach(function(e){charCodes.push(e.charCodeAt())});
  charCodes[changeIndex] = 97 + (charCodes[changeIndex] - 96 ) % 26;

  return String.fromCharCode.apply(0, charCodes);
}

  //-------------------EDIT ( GENERATE KEYS LIKE THIS )------------
function generateKeys(lastKey)
{
  var json = [];
  var nextKey = new Array(lastKey.length + 1 ).join('a');
  json.push(nextKey);

  while( nextKey != lastKey )
  {
    json.push( (nextKey = getNextKey(nextKey)) )
  }

  return json;
}
  //---------------------------Example----------------------------


var last = 'test';
console.log('Last Key : '+last+' | Generated key length : '+generateKeys(last).length);


如果您因为密钥生成而更改了正确答案,我已经编辑了答案@Vibhor。 - Burak Akyıldız

1
这对你有用。JS Fiddle在这里。

https://jsfiddle.net/3d789okv/7/

确保您提供的最后一个值将被命中。 否则,您将进入无限循环地狱。 您还可以配置getNext()调用中的字母数。 但是请确保在第一个值和 "aaaaa" 以及最后一个值 "asxas" 中设置相同数量的字母。
 String.prototype.replaceAt=function(index, replacement) {
        return this.substr(0, index) + replacement+ this.substr(index + replacement.length);
    }

 var json = [];
 function getNext(charCount,lastValue){
    changeIndex = charCount -1;
   var newValue = "";
     while (changeIndex >= 0){
        if(lastValue[changeIndex] !== "z"){
           var changed = lastValue[changeIndex];
           var replacechanged = String.fromCharCode(changed.charCodeAt(0)+1);
           newValue = lastValue.replaceAt(changeIndex,replacechanged)
           for(var j=changeIndex+1; j < charCount; ++j){
              newValue = newValue.replaceAt(j,"a");
           }
           return newValue;
         }
         changeIndex--;
      }
 }

 function createJSON(lastValue){
    if(!json.length){
      //var startPrefix = "aaaaa";
      json.push("aaaaa");
      while(lastValue !== json[json.length-1]){

         json.push(getNext(5,json[json.length-1]));
      }
      console.log(json);
    }
 }

 createJSON("aaabz");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接