我想为每个数组项添加前一个值,但第一个数组除外 使用以下代码,结果为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语句写错了吗?
答案 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/1636522。 quote 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
知道了吗?键不是数字:-)