簡體   English   中英

Javascript內部數組長度中的雙循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM