Hämta det minsta värdet från en array i Javascript?
Array justPrices har värden såsom:
[0] = 1.5
[1] = 4.5
[2] = 9.9.
Hur returnerar jag det minsta värdet i arrayen?
Svar #1
Den mest koncisa uttryckliga koden för att hitta minimumvärdet är förmodligen restparametrar:
const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
const min = Math.min(...arr)
console.log(min)Rest-parametrar är i huvudsak en praktisk förkortning för Function.prototype.apply när du inte behöver ändra funktionens kontext:
var arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
var min = Math.min.apply(Math, arr)
console.log(min)Detta är också ett utmärkt användningsfall för Array.prototype.reduce:
const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
const min = arr.reduce((a, b) => Math.min(a, b))
console.log(min)Det kan vara frestande att skicka Math.min direkt till reduce, men återanropsfunktionen får ytterligare parametrar:
callback (accumulator, currentValue, currentIndex, array)
I det här särskilda fallet kan det vara lite ordrikt. reduce är särskilt användbart när du har en samling av komplex data som du vill aggregera till ett enda värde:
const arr = [{name: 'Location 1', distance: 14}, {name: 'Location 2', distance: 58}, {name: 'Location 3', distance: 20}, {name: 'Location 4', distance: 77}, {name: 'Location 5', distance: 66}, {name: 'Location 6', distance: 82}, {name: 'Location 7', distance: 42}, {name: 'Location 8', distance: 67}, {name: 'Location 9', distance: 42}, {name: 'Location 10', distance: 4}]
const closest = arr.reduce(
(acc, loc) =>
acc.distance < loc.distance
? acc
: loc
)
console.log(closest)Och naturligtvis kan du alltid använda klassisk iteration:
var arr,
i,
l,
min
arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
min = Number.POSITIVE_INFINITY
for (i = 0, l = arr.length; i < l; i++) {
min = Math.min(min, arr[i])
}
console.log(min)...men även klassisk iteration kan få en modern uppgradering:
const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
let min = Number.POSITIVE_INFINITY
for (const value of arr) {
min = Math.min(min, value)
}
console.log(min)Svar #2
Jon Resig illustrerade i denna artikel hur detta kunde uppnås genom att utvidga Array-prototypen och anropa den underliggande Math.min-metoden som tyvärr inte tar en array utan ett variabelt antal argument:
Array.min = function( array ){
return Math.min.apply( Math, array );
};
och sedan:
var minimum = Array.min(array);
Svar #3
Jag tycker att det enklaste sättet att returnera det minsta värdet i en array är att använda spridningsoperatorn på Math.min()-funktionen.
return Math.min(...justPrices);
//returns 1.5 on example given Sidan på MDN hjälper till att förstå det bättre: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min
Lite extra: Detta fungerar också på Math.max() funktionen
return Math.max(...justPrices); //returnerar 9.9 på det givna exemplet.
Hoppas detta hjälper!
Svar #4
Uppdatering: använd Darins/John Resigs svar, kom bara ihåg att du inte behöver specificera thisArg för min, så Math.min.apply(null, arr) fungerar alldeles utmärkt.
eller så kan du bara sortera arrayen och få värde #1: [2,6,7,4,1].sort()[0]
[!] Men utan att tillhandahålla en egen nummer-sorteringsfunktion kommer detta endast att fungera i ett enda, mycket begränsat fall: positiva nummer mindre än 10. Se hur det skulle gå sönder:
var a = ['', -0.1, -2, -Infinity, Infinity, 0, 0.01, 2, 2.0, 2.01, 11, 1, 1e-10, NaN];
// correct:
a.sort( function (a,b) { return a === b ? 0 : a < b ? -1: 1} );
//Array [NaN, -Infinity, -2, -0.1, 0, "", 1e-10, 0.01, 1, 2, 2, 2.01, 11, Infinity]
// incorrect:
a.sort();
//Array ["", -0.1, -2, -Infinity, 0, 0.01, 1, 11, 1e-10, 2, 2, 2.01, Infinity, NaN]
Och också, array ändras på plats, vilket kanske inte är vad du vill.
Svar #5
Föreställ dig att du har denna array:
var arr = [1, 2, 3];
ES6-sätt:
var min = Math.min(...arr); //min=1
ES5-sätt:
var min = Math.min.apply(null, arr); //min=1
Om du använder D3.js finns det en praktisk funktion som gör samma sak, men som kommer att ignorera undefined-värden och också kontrollera det naturliga ordningen:
d3.max(array[, accessor])
Returnerar det högsta värdet i den angivna arrayen med naturlig ordning. Om arrayen är tom returneras undefined. En valfri åtkomstfunktion kan anges, vilket är ekvivalent med att anropa array.map(accessor) innan det högsta värdet beräknas.
Till skillnad från den inbyggda Math.max, ignorerar denna metod odefinierade värden; detta är användbart för att ignorera saknade data. Dessutom jämförs element med naturlig ordning istället för numerisk ordning. Till exempel är maxvärdet av strängarna ["20", "3"] "3", medan maxvärdet av talen [20, 3] är 20.
Och detta är källkoden för D3 v4:
export default function(values, valueof) {
var n = values.length,
i = -1,
value,
max;
if (valueof == null) {
while (++i < n) { // Find the first comparable value.
if ((value = values[i]) != null && value >= value) {
max = value;
while (++i < n) { // Compare the remaining values.
if ((value = values[i]) != null && value > max) {
max = value;
}
}
}
}
}
else {
while (++i < n) { // Find the first comparable value.
if ((value = valueof(values[i], i, values)) != null && value >= value) {
max = value;
while (++i < n) { // Compare the remaining values.
if ((value = valueof(values[i], i, values)) != null && value > max) {
max = value;
}
}
}
}
}
return max;
}
