计算2个数组中出现的相同元素数量

时间:2011-01-27 14:28:24

标签: javascript arrays checkbox

我有一个表单,作为该表单的结果,我有两个数组 - 一个用于personA的详细信息,另一个用于personB的详细信息。表格的一部分是一堆日期复选框 - 日期是固定价格,但在同一天预订两个是降价。

我想要做的是将personA的数组与personB的数组进行比较,并且对于任何重复数据都会降低比率。

费率将计算为两个变量 - 总价格日期(以英镑计)和总减价日期(以英镑计)。

到目前为止,这是我的代码(这发生在onclick复选框上):

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(', ');
}

3 个答案:

答案 0 :(得分:3)

  • 用我自己的http://phrogz.net/JS/ArraySetMath.js你可以做到:

    // 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 );
    
  • 您可以使用较大的JS.Set

    // 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实例),那么我的库允许您提供比较功能,以便您可以确定哪些是相同的。有关详细信息,请参阅库。

答案 1 :(得分: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);

依靠underscore.js轻松实现功能方法的跨浏览器实现。其中大部分都可以通过array.reduce&现代浏览器上的array.map。

答案 2 :(得分: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
}