[英]How to attach the previous item to the next in array?
我想為除第一個數組之外的每個數組項添加上一個值使用以下代碼,結果為true。input為['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 = { keywords: ['python', 'jieba'] }, keywords = config.keywords, keyword; for (keyword in keywords) { if (keyword !== '0') { keywords[keyword] = keywords[keyword - 1] + " " + keywords[keyword] console.log(keywords) } }
您正在將字符串與數字進行比較。 將條件更改為if (keyword!=='0')
。 並且您嘗試訪問的是在首次調用keywords[keyword-1]
時不存在的索引。
另外,我不建議在您的情況下使用for...in
,而是使用Array.reduce
進行簡單的for循環或更高級的解決方案(請參閱@pswg的答案)。 我在條目中引用MDN 作為... :
數組索引只是具有整數名稱的可枚舉屬性,其他方面與常規對象屬性相同。 不能保證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) } }
考慮使用索引而不是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); }
我很遺憾您接受Nina的回答,因為她跳過了重點,而這種疏忽可能會引起誤解。 考慮再次閱讀此答案,這是我認為最有啟發性的內容: https : //stackoverflow.com/a/54700039/1636522 。 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
遺憾的是,這不是bug:-\\確實, 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
無效而keyword !== 0
無效? 請記住, for...in
正在尋找對象鍵,而鍵是字符串。 現在看:
> | "0" != 0 // normal equality with type conversion
< | false
> | "0" !== 0 // strict equality with type comparison
< | true
得到它了? 鍵不是數字:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.