簡體   English   中英

按數字對形式為“[word] [number]”的字符串數組進行排序

[英]sort an array of strings of the form "[word] [number]" by number

我想按["owl 1", "dog 2", "bird 4"]這樣的數字對這個數組進行排序我嘗試了很多方法但仍然相同(我需要新程序員的完美解決方案)

 let v = ['bird 4', "owl 1", "dog 2"] v.sort((a, b) => a - b) console.log(v) // expected = ["owl 1", "dog 2", "bird 4"]

該行為是由於您嘗試比較將按字典順序完成的字符串(鳥先於狗先於貓頭鷹)引起的。 你想按number排序。 所以你只需要看數字,而不是數字前面的單詞。 另請記住, string "4"number 4 不同。

為了獲得所需的行為,您必須解析數字(例如使用Number()Number.parseInt() ),然后使用這些數字進行比較。

 let v = ['bird 4', "owl 1", "dog 2"] v.sort((a,b) => Number(a.split(" ")[1]) - Number(b.split(" ")[1])); console.log(v);

我假設每個字符串都包含一個空格,並且在空格之后有一個實際數字。 如果需要,您將需要處理不是這種情況的情況。

如果解決方案需要“完美”(對於您的新程序員),那么以下可能是一個想法:

 let v = ['bird 4', "owl 11", "dog 2", "horse 11"]; const res=v.map(el=>[el.split(" "),el]).sort(([[aw,an]],[[bw,bn]]) => an-bn||aw.localeCompare(bw)).map(([_,el])=>el); console.log(res);

該代碼片段通過首先將所有元素拆分為它們的“單詞”和“數字”部分來准備修改后的數組,然后通過首先查看“數字”並且僅當它們相同時才對元素進行排序,同時比較它們的單詞部分。 之后,再次從臨時中間數組中提取原始元素。

該代碼比@Mushroomator(好的,)答案中的代碼稍長,但它

  • 通過split()只對元素執行一次來節省一些計算量
  • 如果數字恰好相同,也會按單詞部分排序
  • 它使原始數組v保持不變。

缺點:至少暫時需要更多 memory。

與@Mushroomator 的回答類似,這種方法完全依賴於每個元素的單詞和數字部分之間的空白。 但是,如果需要,您可以將el.split(" ")替換為el.match(/(\D*)(\d*)/).slice(1)類的內容。

排序時從字符串中提取數字。 如果您在空間上使用 split 並取第二項,則代碼很脆弱。 刪除非數字字符並將其轉換為數字更安全。

 let arr = ['bird 4', "owl 1", "dog 2", "nix"] arr.sort((a,b) => Number(a.replace(/[^\d]+/g, '')) - Number(b.replace(/[^\d]+/g, ''))); console.log(arr);

了解正則表達式: https://twiki.org/cgi-bin/view/Codev/TWikiPresentation2018x10x14Regex

您可以匹配編號進行排序。

 const getNumber = s => +s.match(/\d+$/); let v = ['bird 4', "owl 1", "dog 2"] v.sort((a, b) => getNumber(a) - getNumber(b)); console.log(v);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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