Javascript 无法按顺序调用未定义的方法 'indexOf'
Javascript Cannot call method 'indexOf' of undefined at order
我需要创建一个函数来对字符串进行排序。字符串中的每个单词都包含一个数字。数字可以从 1 到 9(没有 0)。
例如输入:"is2 Thi1s T4est 3a" 函数应该 return "Thi1s is2 3a T4est".
我的代码是:
function order(words)
{
// ...
if(words == '')
{
return words;
}
var all_words = words.split(" ");
var checked_words = new Array();
var joined_words = "";
for(i = 1; i <= 9; i++)
{
//console.log(checked_words);
//checked_words[i-1] = all_words;
for(j = 1;j <= all_words.length; j++)
{
if(all_words[i-1].indexOf(i) != -1)
{
checked_words.push(all_words[i-1]);
if(i == (all_words.length))
{
joined_words = checked_words.join(" ");
return joined_words;
}
}
}
}
}
问题是它一直显示 "TypeError: Cannot call method 'indexOf' of undefined at order"。请帮忙谢谢!
我一直在试图弄清楚第一个循环在做什么,我终于意识到它正在检查字符串中的数字。你不应该那样做,因为它 1) 很奇怪,2) 如果它有效,则性能不佳。
改为使用一个循环和一个正则表达式来查找字符串中的数字。
for (var i = 0; i < all_words.length; i++) {
// take the first match and coerce it to an integer
var n = +all_words[i].match(/\d+/)[0];
checked_words[n] = all_words[i];
}
// checked_words has an undefined element at index 0;
// slice takes a copy of the array from index 1
return checked_words.slice(1).join(' ');
或者您可以使用 reduce
。
var joined_words = str.split(' ').reduce(function (p, c) {
var n = +c.match(/\d+/)[0];
p[n] = c;
return p;
}, []).slice(1).join(' ');
您甚至不受数字 0-9 的限制。只要你过滤掉未定义的元素,你就是金...
var str = 'is2 Thi1s T4est 3a Ye12s!';
var out = str.split(' ').reduce(function (p, c) {
var n = +c.match(/\d+/)[0];
p[n] = c;
return p;
}, []).slice(1).filter(function (el) {
return el !== undefined;
}).join(' ');
我需要创建一个函数来对字符串进行排序。字符串中的每个单词都包含一个数字。数字可以从 1 到 9(没有 0)。
例如输入:"is2 Thi1s T4est 3a" 函数应该 return "Thi1s is2 3a T4est".
我的代码是:
function order(words)
{
// ...
if(words == '')
{
return words;
}
var all_words = words.split(" ");
var checked_words = new Array();
var joined_words = "";
for(i = 1; i <= 9; i++)
{
//console.log(checked_words);
//checked_words[i-1] = all_words;
for(j = 1;j <= all_words.length; j++)
{
if(all_words[i-1].indexOf(i) != -1)
{
checked_words.push(all_words[i-1]);
if(i == (all_words.length))
{
joined_words = checked_words.join(" ");
return joined_words;
}
}
}
}
}
问题是它一直显示 "TypeError: Cannot call method 'indexOf' of undefined at order"。请帮忙谢谢!
我一直在试图弄清楚第一个循环在做什么,我终于意识到它正在检查字符串中的数字。你不应该那样做,因为它 1) 很奇怪,2) 如果它有效,则性能不佳。
改为使用一个循环和一个正则表达式来查找字符串中的数字。
for (var i = 0; i < all_words.length; i++) {
// take the first match and coerce it to an integer
var n = +all_words[i].match(/\d+/)[0];
checked_words[n] = all_words[i];
}
// checked_words has an undefined element at index 0;
// slice takes a copy of the array from index 1
return checked_words.slice(1).join(' ');
或者您可以使用 reduce
。
var joined_words = str.split(' ').reduce(function (p, c) {
var n = +c.match(/\d+/)[0];
p[n] = c;
return p;
}, []).slice(1).join(' ');
您甚至不受数字 0-9 的限制。只要你过滤掉未定义的元素,你就是金...
var str = 'is2 Thi1s T4est 3a Ye12s!';
var out = str.split(' ').reduce(function (p, c) {
var n = +c.match(/\d+/)[0];
p[n] = c;
return p;
}, []).slice(1).filter(function (el) {
return el !== undefined;
}).join(' ');