2011-01-27 15 views
1

私はフォームを持っています。このフォームの結果、私は2つの配列を持っています - personAの詳細とpersonBの詳細の配列。フォームの1つの部分は、日付のチェックボックスの束です - 日付は固定価格ですが、同じ日付に2つの予約は、価格の低下です。2つの配列内の同じ要素がいくつあるかをカウントします。

私がしたいことは、personAの配列をpersonBの配列と比較し、重複したものについては減少した割合を発行することです。

レートは2つの変数、合計満期日(£単位)および合計減額金額(£単位)で計算されます。ここで

(これはonclickのチェックボックスで発生する)これまでの私のコードです:

あなたができる http://phrogz.net/JS/ArraySetMath.js自分で
function processDates(){ 
    var contentsA, valsA = [], dates_A = document.forms['registerForm']['personADates[]']; 
    for(var iA=0,elmA;elmA = dates_A[iA];iA++) { 
     if(elmA.checked) { 
      valsA.push(elmA.value); 
     } 
    } 
    contentsA = valsA.join(', '); 

    var contentsB, valsB = [], dates_B = document.forms['registerForm']['personBDates[]']; 
    for(var iB=0,elmB;elmB = dates_B[iB];iB++) { 
     if(elmB.checked) { 
      valsB.push(elmB.value); 
     } 
    } 
    contentsB = valsB.join(', '); 
} 
+1

ただ、ここでは安全のために、私はあなたが予約を言った気づきました。これが学術的なプロジェクトではないと仮定すると、検証はサーバー側で行われる*ことを保証する必要があります。あなたが正式な入力としてJavaScriptを信頼するなら、私はあなたのウェブサイトに来て、私が望むどんなレートであれ自分を与えます。 – Incognito

+0

いいえ、それは学業ではありません。レートはサーバー側で計算されますが、私はクライアント側で合計価格を表示する必要があります –

答えて

1

の代わりにあなたがオブジェクト(警告...未テストコード)を使用することができ、配列を使用して:

function processDates(){ 
    var valsA = {}, dates_A = document.forms['registerForm']['personADates[]']; 
    for(var iA=0,elmA;elmA = dates_A[iA];iA++) { 
     if(elmA.checked) { 
      valsA[elmA.value] = 1; // Store values 
     } 
    } 

    var samedate = []; 
    var dates_B = document.forms['registerForm']['personBDates[]']; 
    for(var iB=0,elmB;elmB = dates_B[iB];iB++) { 
     if(elmB.checked) { 
      if (valsB[elmB.value]) 
      { 
       // Here we found a date that's present in both 
       samedate.push(elmB.value); 
      } 
     } 
    } 
    // Here samedate is a list of all dates listed in both A and B 
} 
3
  • :大きなJS.Set

    // If the original order of the elements is not important 
    var common = array1.intersect(array2); 
    
    // If the original order of the elements is important 
    var common = array1.unsortedIntersect(array2); 
    
  • あなたはできます:

    // If the original order of the elements is not important 
    var common = (new JS.SortedSet(array1)).intersect(new JS.SortedSet(array2)); 
    
    // If the original order of the elements is important 
    var common = (new JS.Set(array1)).intersect(new JS.Set(array2)); 
    

実際にあなたの配列の値が何であるかはわかりません。これらの日付はプレーンテキストでユーザーによって入力されていますか?そうであれば、それらが同等であり、一致することが保証されるように正規化されていることを確認したいでしょう。

これらが単純な比較可能なオブジェクト(StringオブジェクトやDateインスタンスの代わりに複雑なオブジェクトの配列を作成する)の場合、私のライブラリは比較関数を提供して、どれが等しいかを判断できるようにします。詳しくはライブラリを参照してください。

+0

+1コード再利用のために、それはあなたが作ったことを二重に涼しくします。 – Incognito

+0

と一般的な番号付きの値を取得しますか? –

+0

@DanielHanlyいいえ、 'common'は両方の配列に共通するすべての値を持つ配列です。 'common.length'を使っていくつあるのか調べることができます。 – Phrogz

1

機能はJavaScriptがオプションの場合:

_.sum = function(array) { 
    return _.reduce(array, function(memo, val) { 
     return memo + val; 
    }, 0); 
}; 

var duplicates = _.intersect(valsA, valsB); 
var fullPrice = _.sum(valsA.concat(valsB)); 
var reducedPrice = fullPrice - discountScalar * _.sum(duplicates); 

は、機能的な方法を簡単にクロスブラウザのimplentationためunderscore.jsに依存しています。これらのほとんどは、最新のブラウザでarray.reduce & array.mapを使用して実装できます。

関連する問題