2017-07-29 71 views
0

我要求幫助解決,看起來像這樣重命名的字符串數組的問題:函數執行它應該如下重命名重複在一個數組的JavaScript

["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"] 

後:

["a(1)","a(6)","a","a(2)","a(3)","a(4)","a(5)","a(7)","a(8)","a(9)","a(10)","a(11)"] 

沒有重複的空數組和數組應該保持不變。

我的想法是來填充鍵/值對一個空的對象,然後只需將它們推到一個新的數組:

function renameFiles(arr){ 
    var itemsObj = {}; 
    var count = 1; 
    for (var i = 0; i < arr.length; i++){ 

     itemsObj[arr[i]] = count; 
     // if the key present, rename the array item and add it to the 
     // itemsObj 
     if (arr[i] in itemsObj){ 
      itemsObj[arr[i] + '(' + (i - (i - 1)) + ')'] 
     } 

    } 
    console.log(itemsObj) 
    // once the itmesObj is set, run the loop and push the keys to the 
    // array 
    return arr; 

} 

var array = ["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"] 
renameFiles(array); 

的問題是,itemsObj不得到與重複鍵填充。應該有一些其他的方法可以處理這個任務。我是初學者,可能不知道這種方法。

回答

1

你快到了。你會保持一個計數,並重複檢查,然後做另一個檢查用括號重複,並更新計數適當

function renameFiles(arr){ 
 
    var count = {}; 
 
    arr.forEach(function(x,i) { 
 

 
    if (arr.indexOf(x) !== i) { 
 
     var c = x in count ? count[x] = count[x] + 1 : count[x] = 1; 
 
     var j = c + 1; 
 
     var k = x + '(' + j + ')'; 
 

 
     while(arr.indexOf(k) !== -1) k = x + '(' + (++j) + ')'; 
 
     arr[i] = k; 
 
    } 
 
    }); 
 
    return arr; 
 
} 
 

 
var res = renameFiles(["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"]); 
 
console.log(res)
.as-console-wrapper {top:0; max-height:100%!important}

+0

嗯。你每天學習新的東西。不知道你可以在三元運算符內部增加。 – Skam

+0

@Skam - 你可以增加得很好,但依靠分配的結果,正如我在上面所做的那樣,在很多情況下應該避免,至少在我看來。我在這裏做的是爲了避免整個if/else混亂檢查密鑰等,我認爲這很好,因爲在這種特定情況下不應該有任何問題*。 – adeneo

+0

@adeneo你能解釋一下這行'var c = x count嗎? count [x] = count [x] + 1:count [x] = 1;'我還不熟悉這種風格。 – Yunielf

1

你在正確的軌道上。

另一種解決方案,

(function(){ 
    var renameFiles = function(arr){ 
     var counts = {} 
     for(var i=0;i<arr.length;i++){ 
      if(!counts[arr[i]]) 
       counts[arr[i]]=0; 
      counts[arr[i]]++; 
     } 
     arr = []; 
     for(var name in counts){ 
      for(var i=0;i<counts[name];i++){ 
       arr.push(name+(i===0?'':'('+i+')')); 
      } 
     } 
     return arr; 
    } 

    var array = ["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"]; 
    console.log(renameFiles(array)) 
})(); 
+0

偉大的提示我會調整我的代碼。謝謝! – Yunielf