1 回答

TA貢獻1827條經驗 獲得超4個贊
假設它們是字符串(因為在一個有效的 JS 數字中不能有超過 1 個句號),您可以按.字符拆分它并計算各個組件的差異:
function numStringDiff(a, b) {
// split them on dot characters
const aParts = a.split('.');
const bParts = b.split('.');
// loop using longest array length as a container for mapped results
return Array(Math.max(aParts.length, bParts.length)).fill(undefined).map((_, i) => {
const i1 = parseInt(aParts[i] || 0); // fetch aParts[i] or default to 0
const i2 = parseInt(bParts[i] || 0); // fetch bParts[i] or default to 0
// return compared value after defaulting the values.
return i2 - i1;
});
}
console.log(numStringDiff('0.0.0.1.0', '0.0.0.1.12'));
這里的問題是,正如您在評論中所述,它們的長度可能不同。為了讓它在這種情況下工作,我們必須迭代等于最長數組長度的次數,并確保較短數組中的任何缺失項都默認為某個不間斷的值,例如0這樣我們可以安全地減去每個數字出現在最長的列表中,帶有某物或0。
請注意,這0是我僅用于確保您可以計算不同長度數組之間的差異的值,選擇適合您需要的任何(數字或浮點)值。
如果在這種情況下第二個參數的點數比第一個少,則返回負差,否則如果第一個比最后一個長,將返回正差。
一些例子:
numStringDiff('1.1.1', '1.1') // => [0, 0, -1]
numStringDiff('1.1', '1.1.1') // => [0, 0, 1]
numStringDiff('1.1.1', '1.1.1') // => [0, 0, 0]
對于兩個值之間的絕對距離,可以簡單地.map通過這個數組:
numStringDiff('1.1.1', '1.1').map(num => Math.abs(num));
// OR, using short form:
numStringDiff('1.1.1', '1.1').map(Math.abs);
最后,如果您需要將結果作為字符串,只需將.join其與'.':
numStringDiff('1.1.1', '1.1').map(Math.abs).join('.');
知道你想要實現什么。如果您嘗試手動平分版本號(如semver 版本),我建議您不要這樣做,因為此功能總會發現一些場景,例如預發布版本,不僅包含數字,還包含0.0.0-pre-foo-version其他內容。因為我不知道你到底想做什么,所以我會把這個責任留給你去弄清楚:)
添加回答
舉報