Javascript 如何将上一项附加到数组中的下一项?
我想将上一个值添加到每个数组项中,第一个除外 使用以下代码,结果为true。输入为['python','jieba',],输出为['python','python jieba']Javascript 如何将上一项附加到数组中的下一项?,javascript,arrays,Javascript,Arrays,我想将上一个值添加到每个数组项中,第一个除外 使用以下代码,结果为true。输入为['python','jieba',],输出为['python','python jieba'] var config={keywords: ['python','jieba']} var keywords=config.keywords for(keyword in keywords){ if (keyword==0){ } else{ keywords[keyword]=keywords[ke
var config={keywords: ['python','jieba']}
var keywords=config.keywords
for(keyword in keywords){
if (keyword==0){
}
else{
keywords[keyword]=keywords[keyword-1]+" "+keywords[keyword]
console.log(keywords)
}
}
但是如果我使用if语句,代码如下:
var config={keywords: ['python','jieba']}
var keywords=config.keywords
for(keyword in keywords){
if (keyword!==0){
keywords[keyword]=keywords[keyword-1]+" "+keywords[keyword]
console.log(keywords)
}
}
回报是错误的
[ 'undefined python', 'jieba' ]
[ 'undefined python', 'undefined python jieba' ]
if语句写得不正确吗?键是字符串
你需要采取行动
if (keyword != 0) {
或者更好
if (keyword !== '0') {
var config={关键字:['python','jieba']},
关键字=config.keywords,
关键词;
for(关键字中的关键字){
如果(关键字!='0'){
关键词[关键词]=关键词[关键词-1]+“”+关键词[关键词]
console.log(关键字)
}
}
这听起来像是一项针对以下人员的工作:
var关键字=['python','jieba'];
关键词.reduce((a,b,i)=>keywords[i]=`${a}${b}`);
console.log(关键字)代码>考虑使用索引而不是for in切换到传统的for循环:
var-config={关键字:['python','jieba']};
var-keywords=config.keywords;
对于(var i=1;i }
您正在将字符串与数字进行比较。将条件更改为if(关键字!='0')
。当您第一次调用keywords[keyword-1]
时,您试图访问一个不存在的索引
此外,我不建议在您的情况下使用for…in
,而是使用Array.reduce
(参见@p.s.w.g的答案)的简单for循环或更高级的解决方案。我引用MDN条目:
数组索引只是具有整数名和
在其他方面与常规对象特性相同。没有
保证for…in将返回任何特定的索引
秩序。for…in循环语句将返回所有可枚举的
属性,包括具有非整数名称的属性和
继承的
因为迭代的顺序依赖于实现,所以迭代
在一个数组上,不能以一致的顺序访问元素。所以,,
最好使用带有数字索引(或)的for循环
在上迭代时,使用Array.prototype.forEach()或for…of循环)
访问顺序非常重要的数组
var config={关键字:['python','jieba']}
var keywords=config.keywords
对于(var i=1;i }
我认为很遗憾,你接受了尼娜的答案,因为她跳过了一个重要的问题,这个遗漏可能会误导你。考虑再读这个答案,我认为这是最有启发性的。这告诉我们,使用for…in
循环对数组进行迭代是个坏主意,原因有二。第一个例子很明显:
|xs=[“a”]
<|[“a”]
>| for(xs中的i)console.log(i,xs[i])
|0 a
>| xs[“a”]=0
< | 0
>| for(xs中的i)console.log(i,xs[i])
|0 a
|a 0
悲哀的是,这并不是一个bug:-\事实上,
中的“for…”旨在迭代可枚举属性,而索引只是其中的一部分
|Object.keys(xs)//返回可枚举属性
<|[“0”,“a”]
第二个原因是,for…in
可能无法以一致的顺序访问元素。大多数情况下,一切都按预期进行,但总有一天你会观察到这样一种奇怪的行为:
var config={keywords: ['python','jieba']}
var keywords=config.keywords
for(keyword in keywords){
if (keyword!==0){
keywords[keyword]=keywords[keyword-1]+" "+keywords[keyword]
console.log(keywords)
}
}
|xs=[“a”,“b”]
<|[“a”、“b”]
>| for(xs中的i)console.log(i,xs[i])
|1b
|0 a
同样,这不是一个bug。由于属性并不总是索引,因此没有理由按特定顺序访问它们。考虑到你的要求,这可能是有害的。实际上,如果再向数组中添加一个元素,则您的算法可能会出现不可预测的行为:
|xs=[“python”、“解霸”、“更多”]
<|[“python”、“解霸”、“更多”]
>| for(i在xs中){
|如果(i!=“0”)xs[i]=xs[i-1]+“”+xs[i];
|log(i,xs[i]);
| }
|xs
上述代码可能会产生预期的跟踪:
| 0 python
|1.巨蟒接骨
|2蟒蛇解霸更多
<|[“python”、“python解霸”、“python解霸更多”]
但它也可能产生像这样意想不到的结果:
var config={keywords: ['python','jieba']}
var keywords=config.keywords
for(keyword in keywords){
if (keyword!==0){
keywords[keyword]=keywords[keyword-1]+" "+keywords[keyword]
console.log(keywords)
}
}
| 2解霸更多
|0 python
|1.巨蟒接骨
<|[“python”、“python解霸”、“解霸更多”]
现在我希望您清楚地知道,在
中使用for…迭代数组是一个坏习惯。您最好切换到一个好的旧for
循环或一个for…of
循环:
| for(i=0;i| for(x/xs)console.log(x)
|a
最后,让我们弄清问题的根源。为什么关键字!=0
在关键字!==0
失败?请记住,for…in
正在查找对象键,键是字符串。现在看看:
|“0”!=0//具有类型转换的正常等式
<|错误
> | "0" !== 0//具有类型比较的严格等式
<|正确
明白了吗?键不是数字:-)配置关键字的值是多少?