Подсчитайте, сколько одинаковых элементов в 2 массивах встречаются - PullRequest
1 голос
/ 27 января 2011

У меня есть форма, и в результате этой формы у меня есть два массива - один для данных о лице А и один для данных о человеке. Одна часть формы представляет собой набор флажков с датами - даты указаны по фиксированной цене, но при бронировании на двоих в одну и ту же дату цена снижена.

То, что я хочу сделать, это сравнить массив personA с массивом personB, и для любых дубликатов вывести пониженную скорость.

Ставка будет рассчитываться по двум переменным - итоговые даты полной цены (в фунтах стерлингов) и суммарные даты сниженной цены (в фунтах стерлингов).

Вот мой код (это происходит на флажках при нажатии):

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 ]

3 голосов
/ 27 января 2011
  • С моим собственным 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 голос
/ 27 января 2011

Вместо использования массива вы можете использовать объект (предупреждение ... непроверенный код):

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
}
1 голос
/ 27 января 2011

Если функциональный 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 в современных браузерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...