[英]Double for loop in Javascript inner array length
我正在嘗試創建一個函數,該函數接受一個字符串並將每個字母值更改為 "(" 如果字符在字符串中沒有重復,如果字符在字符串中存在重復,則更改為 ")"。 我決定走一條非常規的路線來解決這個問題,但我遇到了一個雙重 for 循環的問題。 據我了解,javascript 中的內部 for 循環無法訪問循環外的變量。 我想遍歷數組中的每個項目兩次,但我不確定將內部循環長度設置為什么。
這是我的代碼:
function sortAndChange(word) {
const splitter = word.toLowerCase().split("");
//let jSplitter = word.toLowerCase().split("").length;
let endResult = "";
let truthArray = [];
for(i = 0; i < splitter.length; i++){
for(j = 0; j < splitter.length; j++){
console.log(j);
if(splitter[i] == splitter[j]){
truthArray.push(true);
} else {
truthArray.push(false);
}
}
console.log(truthArray);
truthArray.every(item => item === false) ? endResult += "(" : endResult += ")";
truthArray = [];
}
console.log(endResult);
}
預期結果:
sortAndChange("Success") //expected output: ")())())"
sortAndChange("easy") //expected output: "(((("
您可以按以下步驟執行此操作:
split
將字符串轉換為數組並在其上使用map()
。indexOf()
和lastIndexOf()
以檢查其是否重復。)
或(
。然后最后join
數組 function sortAndChange(str){ let arr = str.toLowerCase().split('') return arr.map(x => { //if its not duplicated if(arr.indexOf(x) === arr.lastIndexOf(x)){ return '(' } //If its duplicated else{ return ')' } }).join(''); } console.log(sortAndChange("Success")) //expected output: ")())())" console.log(sortAndChange("easy")) //expected output: "(((("
您可以獲取一個對象並保留一個布爾值,以便稍后映射這些值。
這種方法有兩個O(2n) 的循環
function sortAndChange(word) { word = word.toLowerCase(); var map = [...word].reduce((m, c) => (m[c] = c in m, m), {}); return Array .from(word, c => '()'[+map[c]]) .join(''); } console.log(sortAndChange("Success")); // )())()) console.log(sortAndChange("easy")); // ((((
看看下面的片段和評論
function sortAndChange(str) { // we create an array containing the characters on the string // so we can use Array.reduce return str.split('').reduce((tmp, x, xi) => { // we look if the character is duplicate in the string // by looking for instance of the character if (str.slice(xi + 1).includes(x.toLowerCase())) { // Duplicate - we replace every occurence of the character tmp = tmp.replace(new RegExp(x, 'gi'), ')'); } else { // Not duplicate tmp = tmp.replace(new RegExp(x, 'gi'), '('); } return tmp; }, str); } console.log(sortAndChange('Success')); //expected output: ")())())" console.log(sortAndChange('Easy')); //expected output: "(((("
這可以使用regex
和 javascript 中的map
結構的組合輕松實現:
const input = "this is a test"; const characters = input.toLowerCase().split(''); const transformed = characters.map(currentCharacter => { const regexpression = new RegExp(currentCharacter, "g"); if (input.toLowerCase().match(regexpression || []).length > 1) return ')' return '('; }).join(""); console.log(transformed);
1) 使用Array.from
轉換為字符數組
2)使用reduce
來構建對象,鍵值對作為字符串中的字符和(或)作為基於重復的值。
3)現在使用來自上述對象的字符將原始字符串轉換為結果字符串。
function sortAndChange(str) { const str_arr = Array.from(str.toLowerCase()); const obj = str_arr.reduce( (acc, char) => ((acc[char] = char in acc ? ")" : "("), acc), {} ); return str_arr.reduce((acc, char) => `${acc}${obj[char]}`, ""); } console.log(sortAndChange("Success")); // ")())())" console.log(sortAndChange("easy")); // ((((
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.