Javascript: 未定义单词反转功能?
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,所以我假设我只是没有注意到一个简单的结构问题。
一种方法是 split
空 spaces 的句子,然后 reverse
和 join
空 spaces split
通过 space 然后 reverse
和 join
以及空的 space.
如果你这样做的话:
"Hello Hannah"
将转换为 "olleH hannaH"
编辑: 您可以将原型定义为字符串作为您自己对单行解决方案的扩展。
String.prototype.Flip = function() {
return this.split("").reverse().join("").split(" ").reverse().join(" ");
};
var a="Hello Hannah";
alert(a.Flip());
你试图将一个函数嵌套在一个函数中,这让事情变得过于复杂。创建一个单独的函数来完成反转单词和字符的工作:
var flipper = function reverse(splitStr) {
return splitStr.split('').reverse().join('').split(' ').reverse().join(' ');
};
alert(flipper("Hello Hannah"));
好吧,这部分会导致函数立即 return,因为它什么都没有 return,所以你得到 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)
时,array
中的每个元素都会调用函数 callback
。相当于下面的代码:
var array = [1, 2, 3];
for(var i = 0; i < array.length; i++) {
callback(array[i]);
}
本质上,它是一种 "functional" 遍历数组并对每个元素执行某些操作的方法。 map
也这样做;它也遍历数组,但是将数组的每个元素(映射)到其他和returns a new 由映射元素组成的数组。 其他 由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
的 return 值来构造新数组。使用 map
,您可以将上面的内容重写为:
var squares = array.map(function(num) {
return num * num;
});
现在将其应用于解决方案,您可以看到我们正在将句子 中的每个单词 映射到它的反向 ,然后加入在映射数组上。
你很接近,但代码有点多了。试试这个:
function reverse(splitStr) {
return splitStr.split('').reverse().join('');
}
console.log(reverse('Hello Hannah'));
我刚刚从您的代码中删除了主要的主力并简化了功能。你走在正确的轨道上,
编辑
如果你想像 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'));
我正在尝试创建一个单词反转器函数,它将反转字符串中每个单词的字母顺序,而不使用任何循环。
到目前为止我有这个:
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,所以我假设我只是没有注意到一个简单的结构问题。
一种方法是 split
空 spaces 的句子,然后 reverse
和 join
空 spaces split
通过 space 然后 reverse
和 join
以及空的 space.
如果你这样做的话:
"Hello Hannah"
将转换为 "olleH hannaH"
编辑: 您可以将原型定义为字符串作为您自己对单行解决方案的扩展。
String.prototype.Flip = function() {
return this.split("").reverse().join("").split(" ").reverse().join(" ");
};
var a="Hello Hannah";
alert(a.Flip());
你试图将一个函数嵌套在一个函数中,这让事情变得过于复杂。创建一个单独的函数来完成反转单词和字符的工作:
var flipper = function reverse(splitStr) {
return splitStr.split('').reverse().join('').split(' ').reverse().join(' ');
};
alert(flipper("Hello Hannah"));
好吧,这部分会导致函数立即 return,因为它什么都没有 return,所以你得到 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)
时,array
中的每个元素都会调用函数 callback
。相当于下面的代码:
var array = [1, 2, 3];
for(var i = 0; i < array.length; i++) {
callback(array[i]);
}
本质上,它是一种 "functional" 遍历数组并对每个元素执行某些操作的方法。 map
也这样做;它也遍历数组,但是将数组的每个元素(映射)到其他和returns a new 由映射元素组成的数组。 其他 由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
的 return 值来构造新数组。使用 map
,您可以将上面的内容重写为:
var squares = array.map(function(num) {
return num * num;
});
现在将其应用于解决方案,您可以看到我们正在将句子 中的每个单词 映射到它的反向 ,然后加入在映射数组上。
你很接近,但代码有点多了。试试这个:
function reverse(splitStr) {
return splitStr.split('').reverse().join('');
}
console.log(reverse('Hello Hannah'));
我刚刚从您的代码中删除了主要的主力并简化了功能。你走在正确的轨道上,
编辑
如果你想像 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'));