2017-08-31 145 views
0

加拿大郵政代碼如下:生成假的郵政編碼

L5R 1Y2 

我一直一直與lodash玩弄接從串隨機元素,這裏是我想出了。

num1 = _.sampleSize('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 1); 

char1 = _.sampleSize('123456789', 1); 

num2 = _.sampleSize('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 1); 

char2 = _.sampleSize('123456789', 1); 

num3 = _.sampleSize('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 1); 

char3 = _.sampleSize('123456789', 1); 

char4 = _.sampleSize('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 1); 

console.log(char1,num1,char2 + ' ' + char3,num3,char4) 

我對這段代碼不滿意,有關如何優化它的任何建議?

+0

你能更具體嗎?你想改善什麼? –

+0

這麼多重複的步驟,感覺就像一個業餘的工作,或者這是可以接受的?你們有什麼感想? – Deano

回答

1

這是一個有點短:

let letters = _.times(3,() => _.sample('ABCDEFGHIJKLMNOPQRSTUVWXYZ')); 
 
let numbers = _.times(3,() => _.sample('123456789')); 
 
console.log(`${letters[0]}${numbers[0]}${letters[1]} ${numbers[1]}${letters[2]}${numbers[2]}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

好想法,我喜歡es6語法很多更清潔,謝謝:) – Deano

+1

對於額外的es6善良,你可以解構數組:let [letter1,letter2,letter3] = _ .times(3,()=> ...) ; –

+0

我不知道Lodash,但它可能有某種拉鍊合併功能,可以自動組合這兩個陣列? – nnnnnn

1

假設你可以使用隨機INT發電機,從字母和數字的字符串挑角色,在兩個陣列到達:

const arrayOfLetters = ["H", "H", "H"]; 
const arrayOfNumbers = ["0", "0", "0"]; 

交錯的概念其實很簡單:

const interleave = (arr1, arr2) => 
    Array.from({ length: arr1.length }) // or use Math.min or Math.max 
    .map((_, i) => [arr1[i], arr2[i]]) 
    .reduce((a, b) => a.concat(b), []); 

interleave(arrayOfLetters, arrayOfNumbers).join(""); // H0H0H0 

交錯任意數量的陣列並不是什麼難事。

空間劃分在技術上並不是規範的一部分(也可以用連字符分隔)。所以,如果你真的想包括它,或包括它的空間,那麼你可以做這樣的事情:

const generateCanadianPostalCode = (separator = " ") => { 
    const letters = generateLetters(3); 
    const numbers = generateNumbers(3); 
    const sequence = interleave(letters, numbers); 
    const halves = [ 
    sequence.slice(0, 3).join(""), 
    sequence.slice(3).join(""), 
    ]; 
    return halves.join(separator); 
};