我試圖用一組特定的字符(如:"*")來替換隨機字串中的字符。
一個特定的字符(即:"*"),我將在下面的代碼中詳細解釋。
/**。
* 回傳一個具有替換量的字串,該字串為設定的字串
* @param {string} str The input
* @param {number} amountToReplace 你想替換的字母的數量。
* @param {string} generalReplace 要替換的一般字母。
* @returns {string} 回傳一個帶有字串的字串。回傳一個包含已完成的字串的字串。
*/
var str = 'thisisastring'/span>;
var amountToReplace = 5;
var generalReplace = '*'/span>
///在這邊的功能,比如說,名稱為replacer的功能。
var returnMe = replacer(str, amountToReplac
如果這些引數聽起來讓人困惑,我還是個新手!
因此,字串,
如果這些引數聽起來讓人困惑,我還是個新手。
所以字串,str是輸入的字串,amountToReplace是你想要替換的字母數量,generalReplace是你想要替換的一般字符。
如果數量是5,我所期望的輸出是這樣的:
原件: thisisastring
回傳的字串應該是替換字串中的隨機部分(但仍然做輸入的數量,而不是做5個替換,但回傳3個,因為找到了共同的匹配)。
謝謝!
uj5u.com熱心網友回復:
最小的(可以說是最簡單的):
.- 將字串分割成陣列
[...str] // (現在是一個陣列) - 在隨機點上回圈插入一個帶有替換字符的陣列,比如:
["t", "h", "i", ["*"], "i", ["*"], ... 繼續回圈,直到i(amount)不是0,并且直到迭代索引的當前值是一個Array。- 一旦全部完成,因為我們有一個二維陣列,使用
Array.prototype.flat()使其成為一維的,如:["t", "h", "i", "*", "i", "*", .../code> - 然后用
Array.prototype.join()將其轉換為字串。
const replacer = (str, i, rep)=> {
if (!str) return; //do nothing if no string passed.
const arr = [...str]; //將字串轉換為陣列。
const len = arr.length
i = Math.min(Math. abs(i), len); // Fix to Positive and not > len .
while (i) {
const r = ~~(Math.random() * len) 。
if (Array.isArray(arr[r]) continue; // Skip if is array (not a character)
arr[r] = [rep]; //用rep字符插入一個陣列。
--i;
}
return res.flat().join(")。
};
console。 log(replacer("thisisastring", 5, "*"));
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
上面的例子是經過實戰檢驗的,即使在以下情況下也能驚人地作業:
"*****"amount大于字串的長度amount是一個負整數最長的是:
。- 生成一個N(
amountToReplace)隨機唯一整數的陣列 。
- 將輸入的字串轉換為陣列,遍歷它,將該隨機索引中的每個字符替換為
generalReplace"*"字符 。
/**.
*創建一個唯一的整數陣列
* @param {Integer} len 陣列長度
* @param {Integer} max 最大的整數價值
* @returns {Array}隨機唯一整數的陣列。隨機唯一整數的陣列
*/ */
function genArrRandInt(len, max) {
const nums = new Set() 。
while (nums.size !== len) nums.add(Math. floor(Math.random() * max))。
return [...nums]。
};
/**。
* Returns a string with replaced amount of strings with a set string.
* @param {string} str The input
* @param {number} amountToReplace 你想替換的字母的數量。
* @param {string} generalReplace 要替換的一般字母
* @returns {string} 回傳一個帶有字串的字串。回傳一個包含已完成的字串的字串。
*/
function replacer(str, amountToReplace, generalReplace) {
const strArr = [...str] 。
const uniqueArr = genArrRandInt(amountToReplace, str.length) 。
uniqueArr.forEach(i => strArr[i] = generalReplace) 。
return strArr.join("") 。
}
const str = "thisisastring";
const amountToReplace = 5;
const generalReplace = "*"/span>;
//在這里的功能,例如,與替換者的名字。
const returnMe = replacer(str, amountToReplace, generalReplace)。
console.log(returnMe);
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
uj5u.com熱心網友回復:
代碼可能是這樣的:
function rand(min, max){
let mn = min, mx = max;
if(mx ==undefined){
mx = mn; mn = 0;
}
return mn Math.floor(Math. random()*(mx-mn 1)。
}
function randCharReplace(string, replaceWith = '*'/span>, replaceCount = 1){
const a = string.split(''/span>), m = a.length-1;
const f = ()=>{
return rand(0, m)。
}
for(let i=0, r; i<replaceCount; i ){
while(r ==undefined || a[r] == replaceWith){
r = f()。
}
a[r] = replaceWith。
}
return a.join(''/span>)。
}
console. log(randCharReplace('thisisastring', '*', 5) ) 。
<iframe name="sif3" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
uj5u.com熱心網友回復:
使用Set的更好的有效方法
。 。function replacer(str, len = 0, generalReplacer) {
const length = len > str.length ? str.length : len。
set = new Set()。
newStr = [];
while (set.size !== length) {
set.add(Math.floor(Math. random() * str.length))。)
}
for (let i = 0; i < str.length; i) {
set.has(i)? newStr.push(generalReplacer) : newStr.push(str[i]) 。
}
return newStr.join("") 。
}
console. log(replacer("thisisastring", 5, "*") ) 。
console. log(replacer("thisisastring", 1, "*") ) 。
console. log(replacer("thisisastring", 7, "*"));
<iframe name="sif4" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
uj5u.com熱心網友回復:
function replacer(string, amount) {
// If string contains all '*' return string.
if ([...string.matchAll(/*/g)].length ==string.length) {
return string
}
//復制ori字串轉換為陣列。
let res = [...string]
let i = amount
let e = ['*'/span>, ' ']
//迭代次數
while (i >= 1) {
//獲得陣列中的隨機索引。
const randomIdx = Math.floor(Math)。 random() * string.length)
//獲得索引處的char。
const randomChar = res[randomIdx] 。
//檢查它是否不是'*'或''。
if (!e.includes(randomChar)) {
//span>用'*'替換字符。
res.splice(randomIdx, 1, '*'/span>)
i--
}
}
return res.join(''/span>)
}
<iframe name="sif5" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
你可以試試這個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/321034.html
標籤:
