簡體   English   中英

如何將前一項附加到數組中的下一項?

[英]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語句寫錯了嗎?

聽起來這是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); 

關鍵是一個字符串。

你需要帶

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM