2

変数が文字列に既に存在する場合、変数の名前を変更する (append-1、-2 など) 最も効率的な方法を探しています。

だから私は配列を保持しています」

dupeCheck = [];

そして、変数が表示されるとすぐに:

var UID;

すでに dupeCheck 配列にあるので、すぐに UID の値に -1 を追加したいのですが、

また、3 番目の重複が string-1-1 ではなく string-2 になるのを防ぐ必要があります。

私はこれを見ました:前にjavascript文字列配列の重複にカウントを追加しました が、それはまさに私が望むものではありません...

賢いアイデアはありますか?私はjQueryを好む..

/編集:

例えば:

var dupeUIDCheck = [];  

$.each(data[IDS].UIDs[keys], function(keys, val)
     {
     var currString = val;
     switch (key)
 {
      case "UID":

       UID = unquote(currString);

   //TODO:
   //Detect if multiple UIDs are loaded from a single source, and
   //rename them:

   dupeUIDCheck.push(UID); //Push current ID onto existing array

       //Check if ID exists
       ?
       //If exists rename value of currString, save it in currString
       newName = currSting;
      break;

      case "otherstuff":
           //Other vars to parse
      break;
     }

したがって、「UID」のケースから抜け出すときは、それが一意の値であることを確認したいと思います

4

3 に答える 3

7

機能を関数にラップして、再利用できるようにすることができます。-1以下の関数は、文字列のリストを受け取り、などの接尾辞が付いた文字列のリストを返し-2ます。

function suffixDuplicates( list )
{
    // Containers

    var count = { };
    var firstOccurences = { };

    // Loop through the list

    var item, itemCount;
    for( var i = 0, c = list.length; i < c; i ++ )
    {
        item = list[ i ];
        itemCount = count[ item ];
        itemCount = count[ item ] = ( itemCount == null ? 1 : itemCount + 1 );

        if( itemCount == 2 )
            list[ firstOccurences[ item ] ] = list[ firstOccurences[ item ] ] + "-1";
        if( count[ item ] > 1 )
            list[ i ] = list[ i ] + "-" + count[ item ]
        else
            firstOccurences[ item ] = i;       
    }

    // Return
    return list;
}

たとえば、

[ "Barry", "Henk", "Jaap", "Peter", "Jaap", "Jaap", "Peter", "Henk", "Adam" ]

の出力を返します

[ "Barry", "Henk-1", "Jaap-1", "Peter-1", "Jaap-2", "Jaap-3", "Peter-2", "Henk-2", "Adam" ]

実際の動作を確認するには、 jsFiddleの例へのリンクを次に示します。

于 2012-05-17T22:04:30.883 に答える
2

質問の意味が少しわかりにくいのですが、このようなことをおっしゃっていたのか教えてください。一連の単語があり、いくつかの単語が繰り返されているとします。これらの繰り返される単語を、インスタンスに応じて-1orなどの新しい接尾辞で変更したいと考えています。-2

// Start by creating our string, word array, and result array
var string = "one two one one two one three three one three",
    values = string.split(" "), result = [];

// For every word in the values array
for ( var i = 0; i < values.length; i++ ) {

  // Set a word variable, and an integer suffix
  var word = values[i], int = 1;

  // While our current word (with/without suffix) exists in results
  while ( strArr(word, result) >= 0 ) 
    // Increment the suffix on our word
    word = values[i] + "-" + int++;

  // Push word into result array
  result.push(word);
}

// Function for determining if a string is in an array
function strArr(s,a){
  for ( var j = 0; j < a.length; j++ )
    if ( a[ j ] == s ) return j;
  return -1;
}

// Compare the before and after
console.log( string );
console.log( result.join(" ") );

私たちの結果は

one two one one two one three three one three
one two one-1 one-2 two-1 one-3 three three-1 one-4 three-2
于 2012-05-17T21:59:02.227 に答える
1

重複をチェックしているもののリストを保持する最良の方法は、それらを配列ではなくオブジェクトに含めることです。これにより、それらをすばやく検索して、まだ使用されていない一意のサフィックスを毎回生成できます。この関数を使用すると、ID を関数に渡して、関数がその ID のまだ使用されていない一意のバージョンを返すようにすることができます。渡されたものが使用されていない場合は、それを返します。渡されたものが使用されていた場合は、すべてのサフィックスを取り除き、まだ使用されていない新しいサフィックスを生成し、新しく作成された ID を返します。新しく作成された ID はデータ構造に保存されるため、将来も複製されることはありません。

var idList = {};

makeIdUnique(id) {
    if (id in idList) {
        // remove any existing suffix
        var base = id.replace(/-\d+$/, "");
        // generate a new suffix
        var cnt = idList[base] || 1;
        // while new suffix is in the list, keep making a different suffix
        do {
            id = base + "-" + cnt++;
        } while (id in idList);
        // save cnt for more efficient generation next time
        idList[base] = cnt;
    }
    // put the final id in the list so it won't get used again in the future
    idList[id] = true;
    // return the newly generated unique id
    return(id);
}
于 2012-05-17T21:58:10.417 に答える