2

함수 프로그래밍을 배우는 중이므로 for 루프를 완전히 없애는 것은 때로는 많은 제어와 자유를 제공하기 때문에 어려운 과제였습니다. 다음은 문자열이 isogram인지 확인하는 예입니다 (문자를 반복해서 입력하지 않아야 함). 중첩 된 for 루프를 사용하면 쉽게 해결할 수 있습니다. 고차원 함수 나 다른 어떤 기능을 사용하여이 기능을 수행 할 수있는 방법이 있습니까? 어떤 제안이라도 큰 도움이 될 것입니다.Function 스타일에서 중첩 된 For 루프를 수행하는 방법

코드 :

function isIsogram(string) { 
    let array = string.split(''); 
    let condition = true; 
    for (let i = 0; i < string.length; i++) { //first loop picks character 
    for (j = i + 1; j < string.length; j++) { //second loop compares it rest 
     if (array[i].toLowerCase() == array[j].toLowerCase()) 
     condition = false; //if repeat, the condition false 
    } 
    return condition; 
    } 
} 
+1

첫 번째 반복 이후에 '돌아온'것입니다. – thefourtheye

+1

왜 전체 문자열을 먼저 소문자로 만든 다음 중첩 된 반복마다 이중 lowercasing 대신 분할합니까? 당신은'j'를 어디에도 변함이 없다고 선언하지 않고 있습니다. – Azamantes

+1

문자열을 분할하는 이유는 무엇입니까? 문자열 길이를 가져 와서 반복 할 수 있습니다. 조건 변수는 불필요하므로'condition = false; '대신'false를 반환 '하고 함수의 끝에는'return true;'를 넣을 수 있습니다. 'return condition;'부분은 제거되어야합니다. – Azamantes

답변

2

당신은 사용할 수 있습니다 함께 적절한 문자열 기능 every 또는 some :

function isIsogram(string) { 
    string = string.toLowerCase(); // case insensitive 
    return string.split('').every(function(character, index) { 
     return !string.includes(character, index+1); 
    }); 
} 

대신 includes 당신은 또한 indexOf을 사용했을 수 있습니다.

+0

Bergi에게 감사드립니다. 나는 includes 함수에 대해 전혀 몰랐다. 그러므로 내 마음에 두 개의 for 루프를 사용해야한다는 것은 생각했다. 이렇게하면 문제를 매우 우아하게 해결할 수 있습니다. –

+0

'return string.indexOf (character, index + 1) == -1'은 똑같은 일을합니다. 아마도 당신은 그것을 알았을 것입니다 :-) – Bergi

+0

하하는 내가하지 못했습니다. indexOf로 시도해 보니 매력처럼 작동합니다. 정말로 흥미있는. –

1

또 다른 예는 @Bergi와 비슷하지만 비교를 위해 일부 ES6 기능을 사용합니다.

function isIsogram(string) { 
 
    string = string.toLowerCase(); // case insensitive 
 
    for (let character of Array.from(string).entries()) { 
 
    if (string.includes(character[1], character[0] + 1)) { 
 
     return false; 
 
    } 
 
    } 
 
    return true; 
 
} 
 

 
console.log(isIsogram('abc')); 
 
console.log(isIsogram('abca'));
당신의 ES3 스타일 코드를 보았다 수있는 방법

function isIsogram(string) { 
 
    string = string.toLowerCase(); // case insensitive 
 
    var length = string.length; 
 
    for (var i = 0; i < length; i += 1) { 
 
    for (var j = i + 1; j < length; j += 1) { 
 
     if (string.charAt(i) === string.charAt(j)) { 
 
     return false; 
 
     } 
 
    } 
 
    } 
 
    return true; 
 
} 
 

 
console.log(isIsogram('abc')); 
 
console.log(isIsogram('abca'));

2

당신은을 정렬 할 수 있습니다 (몇 가지 문제를 지적하는 의견에서 지적) String 먼저 every을 적용하십시오. 두 개의 연속 된 문자가 동일 해지면 반복을 중지합니다.

개선 된 구현입니다. 크레딧 @ Xotic750 간다 :

function isIsogram(x) { 
 
    return Array.from(x.toLowerCase()).sort().every((y, i, xs) => i === 0 
 
    ? true 
 
    : y !== xs[i - 1]); 
 
} 
 

 
console.log(isIsogram("consumptively")); 
 
console.log(isIsogram("javascript"));

구현은 (반복의) 현재의 요소의 인덱스를 나타내는 Array.prototype.every 두번째 파라미터를 사용한다. isIsogram은 함수와 인수에 따라 다릅니다.

+2

좋았지 만 소화하기가 매우 어려웠습니다. ((y, i, xs) => i === 0 || y! == xs [i - 1]);'더 명확 해 보인다. 나와 똑같은가? 나는 믿는다? – Xotic750

관련 문제