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

时间:2019-02-14 22:00:52

标签: javascript arrays

我想为每个数组项添加前一个值,但第一个数组除外 使用以下代码,结果为true。输入为['python','jieba'],输出为['python','python jieba']

     CombineLatestStream.list<String>([
        Stream.fromIterable(["a"]),
        Stream.fromIterable(["b"]),
        Stream.fromIterable(["C", "D"])])
        .listen(print);

但是,如果我使用if语句,则代码如下:

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)
 }
}

返回错误,

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)
 }

}

if语句写错了吗?

5 个答案:

答案 0 :(得分:2)

这听起来像是reduce的工作:

var keywords = ['python', 'jieba'];
keywords.reduce((a, b, i) => keywords[i] = `${a} ${b}`);
console.log(keywords);

当然,如果只想获得最终结果(所有关键字组合在一起),只需使用join

var keywords = ['python', 'jieba'];
var joinedKeywords = keywords.join(' ');
console.log(joinedKeywords);

答案 1 :(得分:1)

键是一个字符串。

您需要参加

com.amazonaws.auth.InstanceProfileCredentialsProvider

或更佳

if (keyword != 0) {

if (keyword !== '0') {

答案 2 :(得分:1)

您正在将字符串与数字进行比较。将您的条件更改为if (keyword!=='0')。并且您正在尝试访问首次调用keywords[keyword-1]时不存在的索引。

此外,我不建议您使用for...in,而是使用Array.reduce的简单for循环或更高级的解决方案(请参阅@ p.s.w.g的答案)。我引用了MDN for...in条目:

  

数组索引只是具有整数名称和   在其他方面与常规对象属性相同。没有   保证for ... in将返回任何特定的索引   订购。 for ... in循环语句将返回所有可枚举的   属性,包括具有非整数名称的属性以及   继承。

     

因为迭代的顺序与实现有关,所以进行迭代   数组上的元素可能无法以一致的顺序访问元素。因此,   最好使用带有数字索引的for循环(或   迭代时的Array.prototype.forEach()或for ... of循环)   顺序重要的数组。

var config = { keywords: ['python', 'jieba'] }
var keywords = config.keywords
for (var i = 1; i < keywords.length; i++) { // starting with i=0 would try to access keywords[0 - 1] which results in undefined
    if (keywords[i] != 0) {
        keywords[i] = keywords[i - 1] + " " + keywords[i]
        console.log(keywords)
    }
}

答案 3 :(得分:0)

考虑使用索引而不是for-in切换到传统的for循环:

var config = {keywords: ['python', 'jieba']};
var keywords = config.keywords;
for (var i = 1; i < keywords.length; i++) {
  keywords[i] = keywords[i - 1] + " " + keywords[i];
  console.log(keywords);
}

答案 4 :(得分:0)

我认为很遗憾您接受Nina的回答,因为她跳过了重点,而且这种遗漏可能会误导您。考虑再次阅读此答案,这对我来说是最有启发性的:https://stackoverflow.com/a/54700039/1636522quote from MDN告诉我们,通过for...in循环遍历数组是一个坏主意,这有两个原因。第一个例子很明显:

> | xs = ["a"]
< | ["a"]
> | for (i in xs) console.log(i, xs[i])
  | 0 a
> | xs["a"] = 0
< | 0
> | for (i in xs) console.log(i, xs[i])
  | 0 a
  | a 0

悲伤,这不是错误:-\确实,for...in旨在迭代可枚举的属性,而索引只是其中的一部分。

> | Object.keys(xs) // returns enumerable properties
< | ["0", "a"]

第二个原因是for...in可能不会以一致的顺序访问元素。大多数情况下,一切都会按预期进行,但是总有一天您会观察到如下奇怪的行为:

> | xs = ["a", "b"]
< | ["a", "b"]
> | for (i in xs) console.log(i, xs[i])
  | 1 b
  | 0 a

再次,这不是错误。由于属性并不总是索引,因此没有理由按特定顺序访问它们。考虑到您的要求,这可能是有害的。确实,将一个元素再推入数组,您的算法可能会有不可预测的行为:

> | xs = ["python", "jieba", "more"]
< | ["python", "jieba", "more"]
> | for (i in xs) {
  |   if (i !== "0") xs[i] = xs[i - 1] + " " + xs[i];
  |   console.log(i, xs[i]);
  | }
  | xs

上面的代码可能会产生预期的跟踪:

  | 0 python
  | 1 python jieba
  | 2 python jieba more
< | ["python", "python jieba", "python jieba more"]

但是它也可能产生类似这样的意外情况:

  | 2 jieba more
  | 0 python
  | 1 python jieba
< | ["python", "python jieba", "jieba more"]

现在,我希望这对您很清楚,使用for...in遍历数组是一个坏习惯。您最好切换到旧的for循环或for...of循环:

> | for (i = 0; i < xs.length; i++) console.log(i, xs[i])
  | 0 "a"
> | for (x of xs) console.log(x)
  | a

最后,让我们进入问题的底部。为什么keyword != 0工作失败而keyword !== 0却工作?请记住,for...in正在寻找对象键,而键是字符串。现在看:

> | "0" != 0 // normal equality with type conversion
< | false
> | "0" !== 0 // strict equality with type comparison
< | true

知道了吗?键不是数字:-)