2017-07-03 21 views
5

mam takich danych JSON:JavaScript czek na najnowszej wersji systemu operacyjnego w JSON

var jsondata = [ 
{ 
    data: 'MacOS Sierra 10.12.13' 
}, 
{ 
    data: 'MacOS Sierra 10.12.5' 
} 
]; 

muszę wybrać najnowszą wersję MacOS w tej tablicy. Jak wdrożyć w lepszy sposób? Próbowałem usunąć wszystkie wartości alfanumeryczne i przekonwertować wersje mac na liczby całkowite, ale może nie działać w niektórych sytuacjach (na przykład 101213 będzie większy niż 10135).

Naprawdę doceniam Twoją pomoc.

+0

Jest to ciąg znaków, nie musisz niczego kodować. – SPlatten

Odpowiedz

1

Można po prostu podzielić ciągi do tablicy, a następnie porównać każdy element. Napisałem prostą funkcję, aby to zrobić. Coś jak to powinno działać

https://jsfiddle.net/3xmjmjsb/8/

function compare_versions(ver1,ver2){ 

var version1=ver1.replace(/[^0-9.]/g, "").split('.'); 
var version2=ver2.replace(/[^0-9.]/g, "").split('.'); 

for (var i=0, l=version1.length; i<l; i++) { 

    if(parseInt(version1[i])>parseInt(version2[i])) 
    {return ver1;} 
    else if(parseInt(version1[i])<parseInt(version2[i])) 
    {return ver2;} 

} 

return false; 

} 

i używać go jak ten

var jsondata = [ 
{ 
    data: 'MacOS Sierra 10.12.13' 
}, 
{ 
    data: 'MacOS Sierra 10.12.11' 
} 
]; 

var newest_version=compare_versions(jsondata[0]["data"],jsondata[1]["data"]); 

    if(newest_version){ 
    alert(newest_version); 
    } 
+0

wielkie dzięki, działa idealnie dla mnie! –

+0

Właśnie dokonałem zmiany konwertujących elementy ciągu na liczby całkowite. Chętnie pomogłem :) –

0

Twój problem z konwersją na integers polega na tym, że jeśli liczba cyfr nie jest taka sama, porównanie może dać zły wynik. Możesz spróbować dodać dopełnienie do każdej części wersji, aby wszystkie miały taką samą liczbę cyfr, połączyć części, a następnie po prostu porównać liczby. Nie jestem pewien, czy jest to najlepszy sposób, ale inną opcją byłoby podzielenie przez . i porównanie każdej części osobno, ale zaletą pierwszej metody jest to, że można uzyskać reprezentację integer dla każdej wersji, którą można łatwo porównać.

function getIntVersion(version) { 
 
     // Remove non digits and non-points 
 
     version = version.replace(/[^\d.]/g, ''); 
 
    
 
     var parts = version.split('.'); 
 
     // Make each part same length of 4, add 0 where necessary 
 
     parts = parts.map(p => p.padEnd(4, '0')); 
 
    
 
     version = parts.join(''); 
 
    
 
     return +version; 
 
    } 
 

 
    var version = 'MacOS Sierra 10.13.5'; 
 
    var version2 = 'MacOS Sierra 10.12.13'; 
 
    var intVersion = getIntVersion(version); 
 
    var intVersion2 = getIntVersion(version2); 
 

 
    console.log(intVersion + ' > ' + intVersion2, (intVersion > intVersion2));

Następnie, aby pobrać najnowszą wersję z tablicy po prostu iterację tej tablicy i przechowywać indeks maksymalnej i wartość.

Tutaj jest bardziej kompaktowa wersja:

function getIntVersion(version) { 
    return +version.replace(/[^\d.]/g, '').split('.').map(p => p.padEnd(4, '0')).join(''); 
} 
0

można użyć modułu semver na to:

4000+ innych modułów na npm korzysta z tego modułu zamiast ponownego wdrażania parsowania wersji i ponad 25 milionów miesięcznych pobrań jest testowany dość szeroko.

Z tego modułu, co trzeba zrobić, to w zasadzie jedno-liner (podzielone na 3 linie dla czytelności)

const newest = jsondata 
    .map(o => o.data.replace(/.* /, '')) 
    .sort(semver.rcompare)[0]; 

Teraz console.log(newest); odbitek: 10.12.13

Lub jeśli chcesz zachować całej karty obiekt:

const newest = jsondata 
    .map(o => [o, o.data.replace(/.* /, '')]) 
    .sort((a, b) => semver.rcompare(a[1], b[1]))[0][0]; 

teraz console.log(newest); drukuje: { data: 'MacOS Sierra 10.12.13' }

Pamiętaj, aby użyć: const semver = require('semver');

Powiązane problemy