2015-07-29 3 views
2

Я пытаюсь создать функцию реверса слов, которая изменит порядок букв каждого слова в строке, не используя никаких циклов.Javascript: Word reverse function undefined?

До сих пор у меня есть это:

var strFlip = function(str){ 
    splitStr = str.split(" ");{ 
    return; 
    } 
    var wordFlip = function reverse(splitStr){ 
    return splitStr.split('').reverse().join(''); 
    }; 
}; 

console.log(strFlip("Hello Hannah")); 

wordFlip часть правильно изменяет порядок одного слова, если они используются независимо от остальной части кода. Однако общий код постоянно выводит undefined. Я не знаком с Javascript, поэтому я предполагаю, что просто не замечаю простой структурной проблемы.

+0

Теперь я понимаю, моя самая большая проблема , Я думал, что мой код возвращает результаты вложенных функций, которые будут использоваться во всей мастер-функции в следующих вложенных выражениях. Всем спасибо! –

ответ

2

Ну, эта часть вызывает функцию, чтобы вернуться сразу, и так как он не возвращается ничего, вы получите undefined :

var strFlip = function(str){ 
    splitStr = str.split(" ");{ 
    return; //<-- immediately returns here 
    } 
    ... 

}; 

Я не уверен, что эта часть пытается сделать, но на самом деле делать то, что вы хотите, вы можете сделать это:

var strFlip = function(str) { 
    //Since you are using a variable as a reference to a function 
    //expression/literal, there is no hoisting so you have to 
    //predefine 
    var wordFlip = function reverse(splitStr) { 
     return splitStr.split('').reverse().join(''); 
    }; 

    return str.split(" ").map(wordFlip).join(" ");  
} 

Более элегантный подход должен был бы отказаться от wordFlip и просто использовать анонимный обратный вызов map:

var strFlip = function(str) { 
    return str.split(" ").map(function(word) { 
     return word.split("").reverse().join(""); 
    }).join(" ");  
} 

Чтобы понять, что map делает, давайте посмотрим на forEach первых с момента map работ аналогичным образом. Когда вы используете array.forEach(callback), функция callback вызывается для каждого элемента в array. Это эквивалентно следующий код:

var array = [1, 2, 3]; 
for(var i = 0; i < array.length; i++) { 
    callback(array[i]); 
} 

По сути, это «функциональный» способ итерации по массиву и делать что-то с каждым элементом. map также делает это; он также выполняет итерацию по массиву, но преобразует (отображает) каждый элемент массива в что-то еще и возвращает новый массив, состоящий из отображенных элементов.что-то еще определяется поведением callback. Вот пример, аналогичный приведенному выше примеру. Здесь я с указанием фактического callback, а так, что вы можете увидеть на поведение немного лучше:

var array = [1, 2, 3]; 
var squares = []; 

function square(num) { 
    return num * num; 
} 

for(var i = 0; i < array.length; i++) { 
    squares[i] = square(array[i]); 
} 

Здесь square такая же, как callback и вызывается для каждого элемента. Возвращаемое значение square затем используется для построения нового массива. Используя map, вы можете переписать выше как:

var squares = array.map(function(num) { 
    return num * num; 
}); 

Применяя это решение, вы можете видеть, что мы отображения каждое слово в предложении на реверсе, а затем присоединение на распределенный массив ,

+0

Ваше рекомендуемое решение идеально, однако я смущен тем, что именно делает .map() 'именно так? –

+0

@CharlesWatson Я обновлю свой ответ, чтобы объяснить его более полно. –

+1

Ваше дальнейшее объяснение очень помогло, спасибо! –

0

Один подход был бы split приговор пустотами, а затем reverse и join пустых пространств split снова в пространстве, то reverse и join с пустым пространством.

Если вы сделаете это, то:

"Hello Hannah" будет преобразован в "olleH hannaH"

0

Edit: можно определить прототип строки в качестве собственного расширения для одного решения линии.

String.prototype.Flip = function() { 
 
    return this.split("").reverse().join("").split(" ").reverse().join(" "); 
 
}; 
 

 
var a="Hello Hannah"; 
 
alert(a.Flip());

2

Вы усложнять вещи, пытаясь гнездиться функцию внутри функции. Создайте одну функцию, которая делает как работу реверсирования слова и символы:

var flipper = function reverse(splitStr) { 
 
    return splitStr.split('').reverse().join('').split(' ').reverse().join(' '); 
 
}; 
 

 

 
alert(flipper("Hello Hannah"));

2

Вы довольно близки, но код немного перегружен. Попробуйте следующее:

function reverse(splitStr) { 
    return splitStr.split('').reverse().join(''); 
} 

console.log(reverse('Hello Hannah')); 

Я просто вытащил основную рабочую лошадь из вашего кода и упростил эту функцию. Вы были на правильном пути,

EDIT

Если вы хотите сохранить слова на месте, как Vivin предложил, вы можете сделать что-то вроде:

function reverse(splitStr) { 
    var strs = splitStr.split(' '); 

    var reverseInPlace = []; 

    for (var i = 0; i < strs.length; i++) { 
     reverseInPlace.push(strs[i].split('').reverse().join('')); 
    } 

    return reverseInPlace.join(' '); 
} 

console.log(reverse('Hello Hannah')); 
+0

Это возвращает '' hannaH olleH '' вместо '' olleH hannaH''. Я подозреваю, что OP хочет последнего. –