Javascript 如何将上一项附加到数组中的下一项?

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

我想将上一个值添加到每个数组项中,第一个除外 使用以下代码,结果为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[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//具有类型比较的严格等式
<|正确

明白了吗?键不是数字:-)

配置关键字的值是多少?