2016-07-25 51 views
0

在陣列替換字符串我有以下陣列:尋找改進方法和在Javascript

["cat", "dog", "cow"] 

我想用一個新的字符串替換每個值。

["tiger", "wolf", "diary"] 

目前我通過遍歷for循環和檢查,看看是否需要它的名字要改變一個字符串存在,如果它不那麼我用新值替換它。雖然for循環的作品,我想知道是否有更好的方式做到這一點。

回答

3

假設你有替換做一個對象,你可以使用Array.map

var replace = { 
 
    'cat': 'tiger', 
 
    'dog': 'wolf', 
 
    'cow': 'diary', 
 
}; 
 

 
var starter = ["cat", "dog", "cow"]; 
 

 
var final = starter.map(value => replace[value] || value); 
 
    
 
console.log(final)

如果字符串不在replace對象,replace[value]undefined,因此replace[value] || value評估爲value本身。

反正for肯定更高性能,至少在node.js的,因此到benchmark.js:

Array.map x 2,818,799 ops/sec ±1.90% (76 runs sampled) 
for array x 9,549,635 ops/sec ±1.86% (79 runs sampled) 
Fastest is for array 

在這裏,我用於測試

var Benchmark = require('benchmark'); 
var suite = new Benchmark.Suite; 

suite 
.add('Array.map', function() { 
    var replace = { 
    'cat': 'tiger', 
    'dog': 'wolf', 
    'cow': 'diary', 
    }; 

    var starter = ["cat", "dog", "cow"]; 

    var final = starter.map(value => replace[value] || value); 
}) 
.add('for array', function() { 
    var replace = { 
    'cat': 'tiger', 
    'dog': 'wolf', 
    'cow': 'diary', 
    }; 

    var starter = ["cat", "dog", "cow"]; 

    var final = []; 

    for (var i = 0; i < starter.length; i++) { 
    final.push(replace[starter[i]] || starter[i]); 
    } 
}) 
// add listeners 
.on('cycle', function(event) { 
    console.log(String(event.target)); 
}) 
.on('complete', function() { 
    console.log('Fastest is ' + this.filter('fastest').map('name')); 
}) 
// run async 
.run({ 'async': true }); 
+0

非常整潔的代碼,謝謝! – lost9123193

+0

@ lost9123193我做了一些嘗試,並且'for'的性能更好(請參閱更新後的答案),至少在我如何實現它 – rpadovani

+0

啊我看,我可能不會有超過300個可能的條目,但是在可伸縮性你會建議我堅持for循環嗎? – lost9123193