我有一个表单,作为该表单的结果,我有两个数组 - 一个用于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(', ');
}
答案 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
}