2016-07-26 9 views
1

Ich bin ein Rating-System zu schaffen, die Werte auf den nächsten 0,5 Runden und enthält Werte zwischen 0 und 5JavaScript Splitting ein Wert in ein Array

Wie kann ich über ein Array iterieren einen Wert Aufspalten (gerundet auf die nächsten 0,5), in Einheiten.

let rating = 3.7

let adjustedRating = (Math.round(rating * 2)/2);

z.B. 3.7: ['1','1','1','1',0]

1,4 entspräche ['1', '0.5', '0', '0', '0']

let starsToShow = new Array().fill('0'); starsToShow.forEach((v, i) => { ... });

+0

warum '1.4 entspräche [ '1', '0,5', '0', '0', '0']' 1.4 soll das gleich? – Arif

+0

Ich runde die Bewertung auf den nächsten halben Wert. – rickysullivan

+0

@PranavCBalan würde es als 2 zurückgeben, ['1', '1', '0', '0', '0'] – rickysullivan

Antwort

2

Tun Sie es mit Array.from

let rating = 3.7 
 
let adjustedRating = (Math.round(rating * 2)/2); 
 

 
console.log(
 
    Array.from({ 
 
    // set array length here 
 
    length: 5 
 
    }, function(_, i) { // iterate over element to update 
 
    // get the difference with index 
 
    var dif = adjustedRating - i; 
 
    // based on the difference assign the array value 
 
    return dif >= 1 ? '1' : dif > 0 ? '0.5' : '0'; 
 
    }) 
 
);


einfach mit

for-Schleife

var rating = 3.7, 
 
    res = [], 
 
    adjustedRating = (Math.round(rating * 2)/2); 
 

 
for (var i = 0; i < 5; i++) { 
 
    var dif = adjustedRating - i; 
 
    res.push(dif >= 1 ? '1' : dif > 0 ? '0.5' : '0'); 
 
} 
 

 
console.log(res);

+1

Kühllösung. Ich kannte "Array.from" nicht. Viel weniger Code als der, den ich vorgeschlagen habe. – smoksnes

+0

Schön, und mit ES 2015 :) – rickysullivan

+0

'' 'var diff = (Math.round (rating * 2)/2) - i;' '' – rickysullivan

0

$('.calculate-button').click(function(){ 
 
    var rating = $('.rating').val(); 
 
    var array = new Array(); 
 
    while (rating > 0){ 
 
    var currentRating; 
 
    if(rating > 1) 
 
    { 
 
     var currentRating = 1; 
 
     rating -= currentRating; 
 
     array.push(currentRating); 
 
    } 
 
    else{ 
 
     var currentRating = (Math.round(rating * 2)/2).toFixed(1); 
 
     rating = 0; 
 
     array.push(parseFloat(currentRating)); 
 
    } 
 
} 
 

 
    while (array.length < 5) 
 
    { 
 
    array.push(0); 
 
    } 
 

 
    console.log(array); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" class="rating"/> 
 
<button class="calculate-button">Calculate</button>

0

Das könnte funktionieren, wie man wollte, aber ich würde es vorziehen, wenn Sie den Vorschlag von AlienHoboken nehmen würde. Es ist viel sauberer.

let rating = 3.7; 
let adjustedRating = (Math.round(rating * 2)/2); 

let tempRating = adjustedRating; 
let starsToShow = new Array(5).fill(0); 

for(let i=0; i<5; i++) { 
    if (tempRating > 0.5) { 
    tempRating -= 1.0; 
    starsToShow[i] += 1.0; 
    } else { 
    starsToShow[i]+= 0.5; 
    break; 
    } 
} 

console.log(starsToShow); 
1

Nur ein weiterer Eintrag mit und forEach reduzieren. von ist wahrscheinlich besser, wenn weniger Code wichtig ist (1 Zeile?), Aber Kompatibilität kann ein Problem sein.

// Using forEach 
 
function getRating0(rating) { 
 
    var stars = [0,0,0,0,0]; 
 
    rating = Math.round(rating * 2)/2; 
 
    stars.forEach(function(v, i) { 
 
    stars[i] = rating > 1? 1 : rating > 0? rating : 0; 
 
    --rating; 
 
    }); 
 
    return stars; 
 
} 
 

 
// Using reduce 
 
function getRating(rating) { 
 
    var stars = [0,0,0,0,0]; 
 
    rating = Math.round(rating * 2)/2; 
 
    return stars.reduce(function(acc, v, i) { 
 
    stars[i] = rating > 1? 1 : rating > 0? rating : 0; 
 
    --rating; 
 
    return stars; 
 
    }, stars); 
 
} 
 

 
console.log(getRating0(1.2)); 
 
console.log(getRating0(3.7)); 
 
console.log(getRating(1.2)); 
 
console.log(getRating(3.9));