Javascript 如何访问在IF/ELSE范围外创建的变量,在IF语句中更新它,并在ELSE语句中访问该更新?

Javascript 如何访问在IF/ELSE范围外创建的变量,在IF语句中更新它,并在ELSE语句中访问该更新?,javascript,arrays,object,if-statement,variables,Javascript,Arrays,Object,If Statement,Variables,对不起,我不知道我的问题还能用什么词来表达,因此,我很难找到任何相关的解决办法 项目 我正在创建一个脚本,用于从Excel文件中清除成批的原始文本 …将每个“单元”收集到一个数组中,并将每个“人”推到一个新数组中,同时将其各自的信息位附加到每个人。文本本身包含诸如名字、姓氏和城市之类的内容。有些人在新线路上有多个城市 *所有信息都是随机生成的,任何现实生活中的比较都纯粹是巧合 问题 我能够清理文本并将每行内容转储到一个数组中,没有任何问题,但当我尝试将只有城市的“行”推送到最近的“完整人”时

对不起,我不知道我的问题还能用什么词来表达,因此,我很难找到任何相关的解决办法

项目

我正在创建一个脚本,用于从Excel文件中清除成批的原始文本

…将每个“单元”收集到一个数组中,并将每个“人”推到一个新数组中,同时将其各自的信息位附加到每个人。文本本身包含诸如名字、姓氏和城市之类的内容。有些人在新线路上有多个城市

*所有信息都是随机生成的,任何现实生活中的比较都纯粹是巧合

问题

我能够清理文本并将每行内容转储到一个数组中,没有任何问题,但当我尝试将只有城市的“行”推送到最近的“完整人”时,问题就出现了。例如:

约翰·多伊曾居住在安克雷奇,AK;纽约,;及得梅因

纽约州、纽约州和得梅因州的每一个城市都各自独立,每个城市都是阵列中唯一的项目

当我将一座城市推入新阵列时,我得到:

Uncaught TypeError: Cannot read property 'city' of undefined
代码

这是我正在使用的代码。具体来说,我的问题是
mergeSort(a)
函数:

函数清理(rawData){//从第70行的事件处理程序访问
//将原始数据拆分为“行”
const splitByLine=rawData.split(“\n”);
//按“制表符”将每行拆分为一个数组
const splitByTab=splitByLine.map(line=>{
返回行。拆分(“\t”);
});
//修剪每个阵列单元并移除所有空单元
const cleaned=splitByTab.map(函数(项){
const scrubed=item.map(chunk=>{
返回chunk.trim();
});
const trimmed=scrubed.filter(块=>{
返回块!==“”;
});
返回修剪;
});
//删除所有空数组
常量droppedEmpties=已清理。过滤器(arrayItem=>{
返回arrayItem.length>0;
});
mergeSort(droppedEmpties);//第32行
}
//对每个人居住的城市进行分类
函数合并排序(a){
控制台日志(a);
职能人员(名、姓、性别、城市、生日){
this.firstName=firstName;
this.lastName=lastName;
这个。性别=性别;
this.city=[城市];
这个生日=生日;
}
const people=[];
设toggleID=0;
a、 forEach(person=>{
//如果条目可能是一个人。。。
如果(人长>1){
//设置最后一个已知人员的ID
toggleID=a.indexOf(个人);
让新人=新人(
person[0],//firstName
person[1],//lastName
person[2],//性别
人[3],//城市
人[4]//生日
);
人。推(新人);
log(人员[toggleID]);
}否则{//…否则假设它是一座城市,然后推到前面的人。
人员[toggleID].city.push(人员[0]);//引发错误:无法读取未定义的“city”的属性
}
});
}
//获取表单提交
document.getElementById(“我的表单”).addEventListener(“提交”,函数(e){
e、 预防默认值();
const textarea=document.getElementById(“我的textarea”);
const rawData=textarea.value;
清理(原始数据);//第1行
});

文件
提交
辛西娅·霍格塞特女大急流城,密歇根州12/6/1983
杰奎琳·克罗斯伯恩女锡拉丘兹,纽约3/19/1984
里基·约翰逊男蒂奥加,ND 4/6/1972
吉米·杰瑟普男艾姆斯,IA 10/27/1993
北卡罗来纳州威利斯顿
格兰德福克斯酒店
安德鲁·曼切斯·马累,德克萨斯州埃尔帕索,2001年3月1日
莎拉·史密斯女华盛顿州西雅图1981年7月19日
埃斯特班·法辛男吉尔伯特,亚利桑那州1973年1月30日
华盛顿州斯波坎
南达科他州米诺特
詹姆斯镇公司

嗯,
if
块和
else
块不会同时执行,因此您需要希望
toggleID
已在循环的前一次迭代中设置。这很难保证。但实际上这不是您的问题,
toggleID
是按您的预期设置的。问题在于,当其中一个元素不是被推到
的人时,在随后的运行中,下一个人确实被推到下一个自由索引。不切换到
切换ID
。您应该看到
console.log(people[toggleID])
(在
if
块中)记录
未定义的
,甚至在它引发异常之前

a.indexOf(person)
(或者更好,forEach
回调的第二个参数)将引用原始
a
数组中看到的最后一个索引,而不是与获取前一个person相关的
people
数组。使用它来索引
人员
有时会产生错误(否)的结果-因为您没有每次为
a
中的每个元素创建一个新的人员

相反,你可以

  • 根本不存储
    toggleID
    ,只需每次使用
    people[people.length-1]
    动态查找数组中的最后一个元素
  • 不存储索引,只存储您创建的最后一个
    newPerson
    对象
  • 获取正确的索引,例如,在
    people.push(…)
    之前执行
    toggleID=people.length
    ,或执行
    toggleID=people.push(…)-1

你的钱是对的。我觉得自己有点傻,因为我对一些看起来很明显的事情如此纠结。我放弃了[toggleID]部分,开始按照你的建议向人[people.length-1]施压,一切都很顺利。非常感谢您抽出时间来回复,非常感谢!