Hoe bereken je de som en het gemiddelde van elementen in een array?

Ik heb problemen met het toevoegen van alle elementen van een array en met het middelen ervan. Hoe zou ik dit doen en implementeren met de code die ik momenteel heb? De elementen worden verondersteld te worden gedefinieerd zoals ik het hieronder heb.

<script type="text/javascript">
//<![CDATA[
var i;
var elmt = new Array();
elmt[0] = "0";
elmt[1] = "1";
elmt[2] = "2";
elmt[3] = "3";
elmt[4] = "4";
elmt[5] = "7";
elmt[6] = "8";
elmt[7] = "9";
elmt[8] = "10";
elmt[9] = "11";
// Problem here
for (i = 9; i < 10; i++){
  document.write("The sum of all the elements is: " + /* Problem here */ + " The average of all the elements is: " + /* Problem here */ + "<br/>");
}   
//]]>
</script>

Antwoord 1, autoriteit 100%

var sum = 0;
for( var i = 0; i < elmt.length; i++ ){
    sum += parseInt( elmt[i], 10 ); //don't forget to add the base
}
var avg = sum/elmt.length;
document.write( "The sum of all the elements is: " + sum + " The average is: " + avg );

Herhaal gewoon door de array, aangezien uw waarden strings zijn, moeten ze eerst worden geconverteerd naar een geheel getal. En het gemiddelde is gewoon de som van de waarden gedeeld door het aantal waarden.


Antwoord 2, autoriteit 90%

Een oplossing die ik eleganter vind:

const sum = times.reduce((a, b) => a + b, 0);
const avg = (sum / times.length) || 0;
console.log(`The sum is: ${sum}. The average is: ${avg}.`);

Antwoord 3, autoriteit 91%

ES6

const average = arr => arr.reduce( ( p, c ) => p + c, 0 ) / arr.length;
const result = average( [ 4, 4, 5, 6, 6 ] ); // 5
console.log(result);

Antwoord 4, autoriteit 32%

Het gemiddelde (gemiddelde) berekenen met behulp van reduceen ES6:

const average = list => list.reduce((prev, curr) => prev + curr) / list.length;
const list = [0, 10, 20, 30]
average(list) // 15

Antwoord 5, autoriteit 14%

over het algemeen is het gemiddelde bij het gebruik van one-liner-reductie als volgt

elements.reduce(function(sum, a,i,ar) { sum += a;  return i==ar.length-1?(ar.length==0?0:sum/ar.length):sum},0);

specifiek voor de gestelde vraag

elements.reduce(function(sum, a,i,ar) { sum += parseFloat(a);  return i==ar.length-1?(ar.length==0?0:sum/ar.length):sum},0);

een efficiënte versie is als

elements.reduce(function(sum, a) { return sum + a },0)/(elements.length||1);

Begrijp Javascript Array Vermindering in 1 minuut
http://www.airpair.com/javascript/javascript-array-reduce

zoals gotofritz aangaf, lijkt Array.reduce ongedefinieerde waarden over te slaan.
dus hier is een oplossing:

(function average(arr){var finalstate=arr.reduce(function(state,a) { state.sum+=a;state.count+=1; return state },{sum:0,count:0}); return finalstate.sum/finalstate.count})([2,,,6])

Antwoord 6, autoriteit 12%

Stel ons voor dat we een array van gehele getallen hebben zoals deze:

var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];

Het gemiddelde wordt verkregen met de volgende formule

A= (1/n)Σxi( met i = 1 tot n )… Dus: x1/n + x2/n + … + xn/n

We delen de huidige waarde door het aantal waarden en voegen het vorige resultaat toe aan de geretourneerde waarde.

De handtekening van de methode voor verkleinen is

reduce(callback[,default_previous_value])

De functie terugbellen verminderen heeft de volgende parameters:

  • p: Resultaat
    van de vorige berekening
  • c: Huidige waarde (van de huidige index)
  • i: de indexwaarde van het huidige array-element
  • a: de huidige gereduceerde array

De tweede reduceerparameter is de standaardwaarde… (Gebruikt in het geval dat de array leegis).

De gemiddelde reductiemethode is dus:

var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);

Als je wilt, kun je een aparte functie maken

function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};

En raadpleeg dan gewoon de handtekening van de callback-methode

var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);

Of breid het Array-prototype rechtstreeks uit..

Array.prototype.sum = Array.prototype.sum || function (){
  return this.reduce(function(p,c){return p+c},0);
};

Het is mogelijk om de waarde te delen elke keer dat de reduceermethode wordt aangeroepen..

Array.prototype.avg = Array.prototype.avg || function () {
  return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};

Of nog beter, met de eerder gedefinieerdeArray.protoype.sum()

methode, optimaliseer het proces door de divisie maar één keer te bellen 🙂

Array.prototype.avg = Array.prototype.avg || function () {
  return this.sum()/this.length; 
};

Vervolgens op een willekeurig Array-object van het bereik:

[2, 6].avg();// -> 4
[2, 6].sum();// -> 8

NB: een lege array met als resultaat een NaN-wens is naar mijn mening correcter dan 0 en kan nuttig zijn in specifieke gebruiksgevallen.


Antwoord 7, autoriteit 11%

Gemiddeld kortste one-liner:

let avg = [1,2,3].reduce((a,v,i)=>(a*i+v)/(i+1));

Som kortste one-liner:

let sum = [1,2,3].reduce((a,b)=>a+b);

Antwoord 8, autoriteit 10%

Je kunt ook lodash, _.sum(array) en _.mean(array) gebruiken in het deel Math ( hebben ook andere handige dingen).

_.sum([4, 2, 8, 6]);
// => 20
_.mean([4, 2, 8, 6]);
// => 5

Antwoord 9, autoriteit 4%

Niet de snelste, maar de kortste en in één regel is het gebruik van map() & reduce():

var average = [7,14,21].map(function(x,i,arr){return x/arr.length}).reduce(function(a,b){return a + b})

Antwoord 10, autoriteit 3%

Ik gebruik deze methoden in mijn persoonlijke bibliotheek:

Array.prototype.sum = Array.prototype.sum || function() {
  return this.reduce(function(sum, a) { return sum + Number(a) }, 0);
}
Array.prototype.average = Array.prototype.average || function() {
  return this.sum() / (this.length || 1);
}

BEWERKEN:
Om ze te gebruiken, vraagt u de array gewoon om de som of het gemiddelde, zoals:

[1,2,3].sum() // = 6
[1,2,3].average() // = 2

Antwoord 11, autoriteit 3%

In ES6-readybrowsers kan deze polyfill nuttig zijn.

Math.sum = (...a) => Array.prototype.reduce.call(a,(a,b) => a+b)
Math.avg = (...a) => this.sum(...a)/a.length;

U kunt dezelfde oproepmethode delen tussen Math.sum,Math.avgen Math.max, zoals

var maxOne = Math.max(1,2,3,4) // 4;

u kunt Math.sum gebruiken als

var sumNum = Math.sum(1,2,3,4) // 10

of als je een array hebt om samen te vatten, kun je

. gebruiken

var sumNum = Math.sum.apply(null,[1,2,3,4]) // 10

net als

var maxOne = Math.max.apply(null,[1,2,3,4]) // 4

Antwoord 12, autoriteit 3%

Een stiekeme manier om het te doen, hoewel het het gebruik van (de veel gehate) eval() vereist.

var sum = eval(elmt.join('+')), avg = sum / elmt.length;
document.write("The sum of all the elements is: " + sum + " The average of all the elements is: " + avg + "<br/>");

Ik dacht ik post dit even als een van die ‘out of the box’-opties. Je weet maar nooit, de sluwheid kan je een punt opleveren (of wegnemen).


Antwoord 13, autoriteit 2%

Hier is een snelle toevoeging aan het object “Math” in javascript om er een “gemiddelde” opdracht aan toe te voegen!!

Math.average = function(input) {
  this.output = 0;
  for (this.i = 0; this.i < input.length; this.i++) {
    this.output+=Number(input[this.i]);
  }
  return this.output/input.length;
}

Dan heb ik deze toevoeging aan het object “Math” om de som te krijgen!

Math.sum = function(input) {
  this.output = 0;
  for (this.i = 0; this.i < input.length; this.i++) {
    this.output+=Number(input[this.i]);
  }
  return this.output;
}

Dus alles wat je doet is

alert(Math.sum([5,5,5])); //alerts “15”
alert(Math.average([10,0,5])); //alerts “5”

En waar ik de placeholder-array plaats, geef gewoon je variabele door (de invoer als het getallen zijn, kan een tekenreeks zijn omdat het naar een getal wordt geparseerd!)


Antwoord 14

zet je for loop counter op 0…. je krijgt element 9 en dan ben je klaar zoals je het nu hebt. De andere antwoorden zijn elementaire wiskunde. Gebruik een variabele om je som op te slaan (je moet de strings naar ints casten) en deel deze door je arraylengte.


Antwoord 15

Begin met het definiëren van alle variabelen die we van plan zijn te gebruiken. U zult zien dat ik voor de numbers-array de letterlijke notatie van []gebruik in plaats van de constructormethode array(). Bovendien gebruik ik een kortere methode om meerdere variabelen in te stellen op 0.

var numbers = [], count = sum = avg = 0;

Vervolgens vul ik mijn lege getallenreeks met de waarden 0 tot en met 11. Dit is om me bij je oorspronkelijke startpunt te brengen. Merk op hoe ik op de array count++druk. Dit duwt de huidige waarde van count omhoog en verhoogt deze vervolgens voor de volgende keer.

while ( count < 12 )
    numbers.push( count++ );

Ten slotte voer ik een functie uit “voor elk” van de getallen in de getallenreeks. Deze functie verwerkt één nummer tegelijk, wat ik identificeer als “n” in de hoofdtekst van de functie.

numbers.forEach(function(n){
  sum += n; 
  avg = sum / numbers.length;
});

Uiteindelijk kunnen we zowel de sum-waarde als de avg-waarde naar onze console sturen om het resultaat te zien:

// Sum: 66, Avg: 5.5
console.log( 'Sum: ' + sum + ', Avg: ' + avg );

Bekijk het online in actie op http://jsbin.com/unukoj/3/edit


Antwoord 16

Ik bouw gewoon voort op het antwoord van Abdennour TOUMI. hier zijn de redenen waarom:

1.) Ik ben het met Brad eens, ik denk niet dat het een goed idee is om een object uit te breiden dat we niet hebben gemaakt.

2.) array.lengthis precies betrouwbaar in javascript, ik geef de voorkeur aan Array.reduceomdat a=[1,3];a[1000]=5;, nu zou a.length1001teruggeven.

function getAverage(arry){
    // check if array
    if(!(Object.prototype.toString.call(arry) === '[object Array]')){
        return 0;
    }
    var sum = 0, count = 0; 
    sum = arry.reduce(function(previousValue, currentValue, index, array) {
        if(isFinite(currentValue)){
            count++;
            return previousValue+ parseFloat(currentValue);
        }
        return previousValue;
    }, sum);
    return count ? sum / count : 0; 
};

Antwoord 17

Array.prototype.avg=function(fn){
    fn =fn || function(e,i){return e};
    return (this.map(fn).reduce(function(a,b){return parseFloat(a)+parseFloat(b)},0) / this.length ) ; 
};

Dan:

[ 1 , 2 , 3].avg() ;  //-> OUT : 2
[{age:25},{age:26},{age:27}].avg(function(e){return e.age}); // OUT : 26

Antwoord 18

In groenblijvende browsers kun je pijlfuncties gebruiken
avg = [1,2,3].reduce((a,b) => (a+b);

Als je het 100.000 keer uitvoert, is het tijdsverschil tussen de for-lus-benadering en de reductie verwaarloosbaar.

s=Date.now();for(i=0;i<100000;i++){ n=[1,2,3]; a=n.reduce((a,b) => (a+b)) / n.length };
console.log("100k reduce took " + (Date.now()-s) + "ms.");
s=Date.now();for(i=0;i<100000;i++){n=[1,2,3]; nl=n.length; a=0; for(j=nl-1;j>0;j--){a=a+n[j];} a/nl };
console.log("100k for loop took " + (Date.now()-s) + "ms.");
s=Date.now();for(i=0;i<1000000;i++){n=[1,2,3]; nl=n.length; a=0; for(j=nl-1;j>0;j--){a=a+n[j];} a/nl };
console.log("1M for loop took " + (Date.now()-s) + "ms.");
s=Date.now();for(i=0;i<1000000;i++){ n=[1,2,3]; a=n.reduce((a,b) => (a+b)) / n.length };
console.log("1M reduce took " + (Date.now()-s) + "ms.");
/* 
 * RESULT on Chrome 51
 * 100k reduce took 26ms.
 * 100k for loop took 35ms.
 * 10M for loop took 126ms.
 * 10M reduce took 209ms.
 */

Antwoord 19

Voor de kick:

var elmt = [0, 1, 2,3, 4, 7, 8, 9, 10, 11], l = elmt.length, i = -1, sum = 0;
for (; ++i < l; sum += elmt[i])
    ;
document.body.appendChild(document.createTextNode('The sum of all the elements is: ' + sum + ' The average of all the elements is: ' + (sum / l)));

Antwoord 20

Ik denk dat we kunnen doen zoals

var k=elmt.reduce(function(a,b){return parseFloat(a+parseFloat(b));})
var avg=k/elmt.length; 
console.log(avg);

Ik gebruik parseFloat twee keer omdat
wanneer
1) je voegt (a)9+b(“1”) getal toe, dan is het resultaat “91”, maar we willen optellen. dus ik gebruikte parseFloat

2)Als toevoeging van (a)9+parseFloat(“1”) gebeurt, zal het resultaat “10” zijn, maar het zal een string zijn die we niet willen, dus opnieuw gebruikte ik parseFloat.

Ik hoop dat ik duidelijk ben. Suggesties zijn welkom


Antwoord 21

Hier is mijn beginnersmanier om eenvoudig het gemiddelde te vinden. Ik hoop dat dit iemand helpt.

function numAvg(num){
    var total = 0;
    for(var i = 0;i < num.length; i++) { 
        total+=num[i];
    }
    return total/num.length;
}

Antwoord 22

hier is je oneliner:

var average = arr.reduce((sum,item,index,arr)=>index !== arr.length-1?sum+item:sum+item/arr.length,0)

Antwoord 23

Ik denk dat dit een directe oplossing kan zijn om het gemiddelde te berekenen met een for-lus en functie.

var elmts = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
function average(arr) {
    var total = 0;
    for (var i = 0; i < arr.length; i++) {
        total += arr[i];
    }
        console.log(Math.round(total/arr.length));
}
average(elmts);

Antwoord 24

Er lijken een oneindig aantal oplossingen hiervoor te zijn, maar ik vond dit beknopt en elegant.

const numbers = [1,2,3,4];
const count = numbers.length;
const reducer = (adder, value) => (adder + value);
const average = numbers.map(x => x/count).reduce(reducer);
console.log(average); // 2.5

Of beter gezegd:

const numbers = [1,2,3,4];
const average = numbers.map(x => x/numbers.length).reduce((adder, value) => (adder + value));
console.log(average); // 2.5

Afhankelijk van uw browser moet u mogelijk expliciete functieaanroepen doen omdat pijlfuncties niet worden ondersteund:

const r = function (adder, value) {
        return adder + value;
};
const m = function (x) {
        return x/count;
};
const average = numbers.map(m).reduce(r);
console.log(average); // 2.5

Of:

const average1 = numbers
    .map(function (x) {
        return x/count;
     })
    .reduce(function (adder, value) {
        return adder + value;
});
console.log(average1);

Antwoord 25

Als u het gemiddelde nodig heeft en de vereiste voor het berekenen van de som kunt overslaan, kunt u het gemiddelde berekenen met een enkele aanroep van vermindering:

// Assumes an array with only values that can be parsed to a Float
var reducer = function(cumulativeAverage, currentValue, currentIndex) {
  // 1. multiply average by currentIndex to find cumulative sum of previous elements
  // 2. add currentValue to get cumulative sum, including current element
  // 3. divide by total number of elements, including current element (zero-based index + 1)
  return (cumulativeAverage * currentIndex + parseFloat(currentValue))/(currentIndex + 1)
}
console.log([1, 2, 3, 4, 5, 6, 7, 8, 9, 10].reduce(reducer, 0)); // => 5.5
console.log([].reduce(reducer, 0)); // => 0
console.log([0].reduce(reducer, 0)); // => 0
console.log([].reduce(reducer, 0)); // => 0
console.log([,,,].reduce(reducer, 0)); // => 0
console.log([].reduce(reducer, 0)); // => 0

Antwoord 26

Als iemand het ooit nodig heeft: hier is een recursief gemiddelde.

In de context van de oorspronkelijke vraag wilt u misschien het recursieve gemiddelde gebruiken als u de gebruiker toestaat aanvullende waarden in te voegen en, zonder de kosten van het opnieuw bezoeken van elk element, het bestaande gemiddelde wilt “bijwerken”.

/**
 * Computes the recursive average of an indefinite set
 * @param {Iterable<number>} set iterable sequence to average
 * @param {number} initAvg initial average value
 * @param {number} initCount initial average count
 */
function average(set, initAvg, initCount) {
  if (!set || !set[Symbol.iterator])
    throw Error("must pass an iterable sequence");
  let avg = initAvg || 0;
  let avgCnt = initCount || 0;
  for (let x of set) {
    avgCnt += 1;
    avg = avg * ((avgCnt - 1) / avgCnt) + x / avgCnt;
  }
  return avg; // or {avg: avg, count: avgCnt};
}
average([2, 4, 6]);    //returns 4
average([4, 6], 2, 1); //returns 4
average([6], 3, 2);    //returns 4
average({
  *[Symbol.iterator]() {
    yield 2; yield 4; yield 6;
  }
});                    //returns 4

Hoe:

dit werkt door het huidige gemiddelde en aantal elementen te behouden. Wanneer een nieuwe waarde moet worden opgenomen, verhoogt u het aantal met 1, schaalt u het bestaande gemiddelde met (count-1) / counten voegt u newValue / counttoe aan het gemiddelde.

Voordelen:

  • je telt niet alle elementen op, wat kan resulteren in een groot aantal dat niet kan worden opgeslagen in een 64-bit float.
  • u kunt een bestaand gemiddelde ‘updaten’ als er aanvullende waarden beschikbaar komen.
  • je kunt een voortschrijdend gemiddelde maken zonder de lengte van de reeks te kennen.

Nadelen:

  • maakt veel meer verdeeldheid
  • niet oneindig – beperkt tot Number.MAX_SAFE_INTEGER items, tenzij u BigNumber
  • gebruikt


Antwoord 27

Na het lezen van de andere keuzes, zal ik proberen een eenvoudigere versie te maken voor de toekomstige kijkers, waarbij ik de bestaande code verder uitwerk en geen elegantere versie maak. Allereerst heb je de getallen als strings gedeclareerd. Behalve de .parseInt kunnen we ook het volgende doen:

const numberConverter = elmt.map(Number);

Dus wat de kaart doet, is dat het “een kopie van de originele array retourneert”. Maar ik converteer de waarden naar getallen. Dan kunnen we de reduceermethode gebruiken (het kan ook eenvoudiger, maar ik schrijf gemakkelijk leesbare versies en ik heb ook 2 gemiddelde methoden) Wat de reduceermethode doet, is dat het een accumulator heeft die groter en groter wordt als je waarden toevoegt aan it, terwijl het door de array itereert en (in dit geval) de currentValue eraan toevoegt.:

var i;
const elmt = new Array();
elmt[0] = '0';
elmt[1] = '1';
elmt[2] = '2';
elmt[3] = '3';
elmt[4] = '4';
elmt[5] = '7';
elmt[6] = '8';
elmt[7] = '9';
elmt[8] = '10';
elmt[9] = '11';
console.log(elmt);
const numberConverter = elmt.map(Number);
const sum = numberConverter.reduce((accumulator, currentValue) => {
  return accumulator + currentValue;
}, 0);
const average = numberConverter.reduce(
  (accumulator, currentvalue, index, numArray) => {
    return accumulator + currentvalue / numArray.length;
  },
  0
);
const average2 =
  numberConverter.reduce(
    (accumulator, currentValue) => accumulator + currentValue,
    0
  ) / numberConverter.length;
for (i = 9; i < 10; i++) {
  console.log(
    `The sum of all the elements is: ${sum}. <br> The average of all the elements is: ${average2}`
  );}

Antwoord 28

Ik heb Mansilla‘s antwoordom goed te werken met de extensie om ervoor te zorgen dat ik sommatie van floats en niet aaneenschakeling van strings doe met behulp van parseFloat():

let sum = ourarray.reduce((a, b) => parseFloat(a) + parseFloat(b), 0);
let avg = (sum / ourarray.length) || 0;
console.log(sum); // print out sum
console.log(avg); // print out avg

Antwoord 29

Gemiddelde HTML-inhoud itens

Met jQuery of Javascript’s querySelectorheb je directe toegang tot geformatteerde gegevens… Voorbeeld:

<p>Elements for an average: <span class="m">2</span>, <span class="m">4</span>,
   <span class="m">2</span>, <span class="m">3</span>.
</p>

Dus, met jQuery heb je

var A = $('.m')
  .map(function(idx) { return  parseInt($(this).html()) })
  .get();
var AVG = A.reduce(function(a,b){return a+b}) / A5.length;

Bekijk nog meer 4 manieren (!) om toegang te krijgen tot itens en het gemiddelde te nemen: http://jsfiddle.net/4fLWB /


Antwoord 30

var arr = [1,2,3,4,5]

function avg(arr){
  var sum = 0;
  for (var i = 0; i < arr.length; i++) {
    sum += parseFloat(arr[i])
  }
  return sum / i;
}

avg(arr) ======>>>> 3

Dit werkt met strings als getallen of getallen in de array.

Other episodes