【问题标题】:iterate two arrays and perform AND / OR comparison = return true迭代两个数组并执行 AND / OR 比较 = 返回 true
【发布时间】:2014-12-11 19:53:31
【问题描述】:

这是我目前的过滤功能(相当不完整)

    $('input:checkbox.types').click(function(){
        filterMarkers();
    });


function filterMarkers() {
    var checked = [];
    $('input:checkbox.types:checked').each(function(){
        checked.push($(this).val());
    });
    checked.sort();
    var andor = '';
    var andor = $('[name="and-or"]:checked').val();
    if(andor == 1) {
        // and
        console.log(checked);
        for (var i = 0; i < markers.length; i++) {
            var types = markers[i]['types'].split(",");
            types.sort();
            console.log(types);
        }
    } else {
        // or

    }

}

这是我目前所拥有的图片。

http://snag.gy/rKSTA.jpg

为简单起见,让我们这样说。 A = 选中的复选框 B = 地图标记迭代/当前迭代标记中具有当前项目值的数组

我能够获得选中复选框的值。我还能够将每个标记的逗号分隔字符串转换为数组。我希望能够检查 B 是否包含 A (OR) 中的任何一个,并且能够检查 B 是否必须包含 A (AND)。

有什么想法吗?

对于那些想要对我正在努力完成的事情有“感觉”的人来说,这是有问题的页面。谢谢!

https://www.cablework.co/company

此页面输出我当前的控制台。

一旦我弄清楚这一点,我就可以根据结果隐藏/显示标记。

【问题讨论】:

  • 看起来您正在使用 JQuery。 JQuery 库有一个名为$.inArray(value, array) 的函数。您可以在迭代检查时使用它。
  • 所以你希望函数返回一个数组来表示哪些标记通过了测试,对吗?编辑:或者不,如果每个标记的测试失败/通过,你只想做点什么。
  • 如果框 1 和 4 被选中,当遍历标记“类型”数组时,对于我的“AND”语句,标记迭代必须包含选中的,这将导致 true(就像标记数组是 [1,4,5,7] 是真的,因为它包含所有已检查的),对于我的“OR”语句,如果标记包含 1 或 4 则为真。

标签: javascript arrays dynamic-arrays


【解决方案1】:

这是一个示例函数。您将针对 types 数组在每个标记上运行 test

http://jsfiddle.net/q1k6e74d/5/

function test(op,types,marker){
    var pass;
    if(types.length === 0 || marker.length === 0){
        return false;
    }
    if(op==="and"){
        pass = true;
        for(var i in types){
            if( $.inArray(types[i],marker) == -1 ){
                pass = false;
            }
        }
    }else{ //or
        pass = false;
        for(var i in marker){
            if( $.inArray(marker[i],types) !== -1 ){
                pass = true;
            }
        }
    }
    return pass;
}

var a = [1,4];
var b = [1,5];
console.log("test a",a,"and b",b,test("and",a,b));
console.log("test a",a,"or b",b,test("or",a,b));

可能会更短,但我认为这种方式最容易理解。

【讨论】:

  • 可能有问题。为 b 尝试了 1,4 所以 a 和 b 是 [1,4] 和运算符,应该返回 true,它返回 false。
  • 这应该返回 true - jsfiddle.net/Kryptonit3/q1k6e74d/4 - 因为 1 AND 4 在 [1,4,6,7] 内但它返回 false。
  • 可能是因为我把它弄反了。在测试功能中更改了 b 和 a。似乎工作。现在,你会如何写这个“更短”? @slicedtoad
  • @JesseSzypulski 对于“和”,标记必须是所有的框?还是标记只能是框?
  • 您的代码正在运行。目前正在测试不同的场景。将报告回来。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2015-07-19
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多