错误消息:未捕获的TypeError:无法读取属性'长度'未定义的(...)
第44行,第23栏
我已经阅读了我能找到的与此错误相关的所有帖子,但没有找到适用于这种情况的任何内容。
我试图取一个字符串并将其转换为一个数组数组,格式化为步骤形式(代码之战' kata);一个单词,下一个单词,等等。我遇到的问题是我一直遇到一个未捕获的TypeError:无法读取属性' length'尝试在for循环中使用数组元素的长度时未定义(...)所以在这个嵌套循环中:
for(var i = 0; i < masterStringOdd.length; i++){
temp2 = proArr.slice(0);
start2 = even[i].length - 1;
for(let j = 0; j < odd[i].length; j++){
let replace2 = masterStringOdd.charAt(i);
Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
finalOdd.push(temp2);
}
start2 += even[i+1].length - 1;
}
使用最后一行&#34; start2 + = even [i + 1] .length - 1;&#34; (我已尝试了大约一千种不同的这种情况)我得到错误,但是如果我返回那行&#34;返回甚至[i + 1] .length - 1;&#34;我得到5,这是正确的长度。我的完整代码是在这封电子邮件的最后,如果有人想看它,并相信我,我理解这是荒谬和尴尬(工作代码和完全未完成) - 手头的技能和所有这些。
在这种情况下,我无法弄清楚为什么我无法获得并使用元素长度的值。非常感谢任何帮助。
function wordStep(str) {
let array = str.split(" ");
let even = [], odd = [], proArr = [], finalEven = [], finalOdd = [];
//for loop to create sperate arrays for across and down
for (let i = 0; i < array.length; i++){
if (i%2 === 0){
even.push(array[i]);
} else {
odd.push(array[i].slice(1,-1));
}
}
//data collection and tool variables, might delete them if the are not needed
let finalLength = even.join("").toString().length - (even.length - 1);
let masterStringEven = even.join("").toString();
let yAxis = odd.join("").toString().length;
let masterStringOdd = odd.join("").toString();
//for loop to create protype array
for (let i = 0; i < finalLength; i++){
proArr.push(",");
}
// for loop to create final evens arrays
let start = 0;
for(let i = 0; i < even.length; i++){
let temp1 = proArr.slice(0);
let replace = even[i].split("");
Array.prototype.splice.apply(temp1, [start, replace.length].concat(replace));
finalEven.push(temp1);
start += replace.length-1;;
}
// nested loops for final odds' array
let temp2 = []
let start2 = 0;
for(var i = 0; i < masterStringOdd.length; i++){
temp2 = proArr.slice(0);
start2 = even[i].length - 1;
for(let j = 0; j < odd[i].length; j++){
let replace2 = masterStringOdd.charAt(i);
Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
finalOdd.push(temp2);
}
start2 += even[i+1].length - 1;
}
}
答案 0 :(得分:1)
从根本上说,正在发生的事情是你要经过even
数组的末尾,所以even[i]
会给你undefined
,然后你会尝试阅读length
} undefined
,导致错误。
事实上,我们可以在这个循环中看到:
for(var i = 0; i < masterStringOdd.length; i++){
temp2 = proArr.slice(0);
start2 = even[i].length - 1;
for(let j = 0; j < odd[i].length; j++){
let replace2 = masterStringOdd.charAt(i);
Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
finalOdd.push(temp2);
}
start2 += even[i+1].length - 1;
}
...您假设masterStringOdd.length
始终 <{1}}。代码中没有任何内容可以确保这一点,实际上它通常不会成立。 even.length
是masterStringOdd.length
数组的条目以字符串形式连接在一起的长度; odd
是even.length
个条目的数量。因此,有even
可能至少与even.length
一样大的原因有两个:1。后者是字符串的长度,而不是数组; 2.后者涉及masterStringOdd.length
,而非odd
。
答案 1 :(得分:0)
您的代码的问题在于,在访问它们之前,您不会检查偶数和奇数数组的长度。如果你在wordStep(str)中有 str值,这会产生问题,这些值不会在你访问它们的索引处推送这些数组中的值。
进行适当的数组长度检查以访问特定索引处的数组。
for(var i = 0; i < masterStringOdd.length; i++){
temp2 = proArr.slice(0);
if(even.legth > i)
start2 = even[i].length - 1;
if(odd.length > i){
for(let j = 0; j < odd[i].length; j++){
let replace2 = masterStringOdd.charAt(i);
Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
finalOdd.push(temp2);
}
}
if(even.length > i +1)
{
console.log(even.length);
start2 += even[i+1].length - 1;
}
}
例如 wordStep(“生活对我们有益”); 此调用将正确填充数组,您不会收到任何错误。
但如果 wordStep(“Life Good”); ,如果未应用适当的长度检查,您将在代码中看到问题
plunker验证:http://plnkr.co/edit/QQovAAzlDhXgucikCGAb?p=preview