2017-07-29 68 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