2011-08-26 3 views
6

Comment je peux résumer les valeurs remplies dans le tableau de prix unitaires en utilisant javascript Voici mon html.Javascript Array Sum

<td> 
     <input type="text" style="width: 60px; background: none repeat scroll 0% 0% rgb(255, 255, 255);" maxlength="4" id="unitprice" name="unitprice[]"> 
    </td> 
    <td> 
     <input type="text" style="width: 60px; background: none repeat scroll 0% 0% rgb(255, 255, 255);" maxlength="4" id="unitprice" name="unitprice[]"> 
    </td> 
+0

Les ID doivent être ** uniques **! (et oui, vous pouvez) –

+0

Utilisez les attributs 'class' à la place des attributs' id'. (Vous ne pouvez pas avoir plus qu'un seul élément avec le même ID sur la page.) –

+0

ok si je rends les ID uniques alors comment puis-je faire plus loin? S'il vous plaît rappelez-vous que le prix unitaire est dynamique comme je clique sur Ajouter une nouvelle ligne et cela crée un autre prix unitaire. J'ai donc besoin de leur somme. – Faizan

Répondre

5

Changer votre code HTML à utiliser class au lieu de id (id doit être unique):

<td> 
    <input type="text" 
     style="width: 60px; background: none repeat scroll 0% 0% rgb(255, 255, 255);" maxlength="4" 
     class="unitprice" name="unitprice[]"> 
</td> 
<td> 
    <input type="text" 
     style="width: 60px; background: none repeat scroll 0% 0% rgb(255, 255, 255);" 
      maxlength="4" class="unitprice" name="unitprice[]"> 
</td> 

Ensuite, vous pouvez au total via JavaScript (en utilisant la fonction jQuery .each()):

var totalUnitPrice = 0; 

$('.unitprice').each(function(index) { 
    totalUnitPrice += parseInt($(this).val()); // parse the value to an Integer (otherwise it'll be concatenated as string) or use parseFloat for decimals 
    }); 
+0

A travaillé très bien! Merci – Faizan

+12

'var somme = arr.reduce (fonction (a, b) {return a + b;}, 0);' est plus rapide que jQuery's each(). – Riking

+0

Ou encore plus court 'var sum = réduire ((a, b) => a + b, 0);' – evgpisarchik

2
function getSum(){ 
    var ups = document.getElementsByName('unitprice[]'), sum = 0, i; 
    for(i = ups.length; i--;) 
     if(ups[i].value) 
      sum += parseInt(ups[i].value, 10); 
    return sum; 
} 
+0

Vous pouvez également écrire la boucle 'for' comme' pour (i = ups.length; i -;) ' –

+0

@Felix Yea merci c'est beaucoup plus propre. Je ne suis pas sûr pourquoi je l'ai écrit comme je l'ai fait haha ​​ – Paulpro

0

Donnez votre <input> s id uniques li ke ceci:

<input type="text" id="unitprice_1"> 
<input type="text" id="unitprice_2"> 
<input type="text" id="unitprice_3"> 

calcule ensuite la somme:

var i = 1; 
var sum = 0; 
var input; 
while((input = document.getElementById('unitprice_'+i)) !== null) { 
    sum += parseInt(input.value); 
    ++i; 
} 
alert(sum); 
35

Si vous pouvez obtenir les valeurs dans un tableau, vous ne devez pas utiliser jQuery pour les résumer. Vous pouvez utiliser les méthodes déjà présentes sur l'objet tableau pour effectuer le travail.

Les tableaux ont une méthode .reduce(). Documentation: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce

Array.reduce accepte une fonction comme un argument qui agit comme un rappel de l'accumulateur. La fonction accumulateur accepte 4 arguments (previousValue, currentValue, index, array). Vous avez seulement besoin de 2 d'entre eux pour faire la somme. Ces 2 arguments sont previousValue et currentValue.

var sampleArray = [1, 2, 3, 4, 5]; 
var sum = sampleArray.reduce(function(previousValue, currentValue){ 
    return currentValue + previousValue; 
}); 

Si vous êtes confronté à un problème de compatibilité où l'environnement cible ne supporte pas ECMAScript 5 ou ajouts ci-dessus, utilisez la définition de prototype défini dans l'article lié MDN. (Ci-dessous)

if (!Array.prototype.reduce) { 
    Array.prototype.reduce = function reduce(accumulator){ 
    if (this===null || this===undefined) throw new TypeError("Object is null or undefined"); 
    var i = 0, l = this.length >> 0, curr; 
    if(typeof accumulator !== "function") // ES5 : "If IsCallable(callbackfn) is false, throw a TypeError exception." 
     throw new TypeError("First argument is not callable"); 
    if(arguments.length < 2) { 
     if (l === 0) throw new TypeError("Array length is 0 and no second argument"); 
     curr = this[0]; 
     i = 1; // start accumulating at the second element 
    } 
    else 
     curr = arguments[1]; 
    while (i < l) { 
     if(i in this) curr = accumulator.call(undefined, curr, this[i], i, this); 
     ++i; 
    } 
    return curr; 
    }; 
} 
+0

Ce que je demandais. Le titre original de OP est un peu trompeur. – frostymarvelous

+0

Cette réponse mérite beaucoup plus de reconnaissance. Merci derenard. – backdesk

+1

Utiliser lambda: 'var somme = sampleArray.reduce ((e, i) => e + i)' – aloisdg