这是我的...... 某个数组项具有二进制选项 喜欢
每个位代表一些选项
我需要的是将它与客户请求选项进行比较 让我们说它是0010
所以我需要逻辑只显示$ item [0]和$ item [2]因为第二个字节是1.但是,当没有客户选项时检查:0000我必须全部显示
只有在显示某些选项时才必须有过滤器...
我应该在我的数学课上多听一听......我现在很无能为力,请帮忙!
注意:
一切都来自这里:http://jsfiddle.net/yHxue/
但我不明白这一行:
markers[m].setMap(((markers[m].props & props)>>>0===props)? ((props)?map:null): null);
,所以我重写了它,我的不工作!
答案 0 :(得分:1)
如果您的数据是实际数字,那么只需在每个成员上使用按位&
运算符。
var customerOption = parseInt("0010", 2)
$item.forEach(function(n, i) {
if (customerOption === 0 || ((n & customerOption) == customerOption))
alert(i); // show this item
});
如果它们是字符串,那么您需要先将每个项目转换为数字。
与上述相同,但......
parseInt(n, 2);
var $item = [];
$item[0] = "0010"
$item[1] = "1000"
$item[2] = "0110"
$item[3] = "1101"
var customerOption = parseInt("0010", 2)
$item.forEach(function(n, i) {
if (customerOption === 0 || ((parseInt(n, 2) & customerOption) == customerOption))
document.querySelector("pre").textContent += "\n0010 matched index: " + i;
});
document.querySelector("pre").textContent += "\n\n"
var customerOption = parseInt("0110", 2)
$item.forEach(function(n, i) {
if (customerOption === 0 || ((parseInt(n, 2) & customerOption) == customerOption))
document.querySelector("pre").textContent += "\n0110 matched index: " + i;
});
<pre></pre>
答案 1 :(得分:1)
使用parseInt(string, 2)
将所有字符串(项目和掩码)转换为数字。
如果mask
为0
,请抓住所有项目。如果不是:
然后使用&
运算符查看常见的1
位:
var common = item & mask;
然后测试common
:
common
就不应该是0
。common
应该等于mask
。编辑:
markers[m].setMap(
((markers[m].props & props) >>> 0 === props) ?
((props) ? map : null) :
null
);
markers[m].props & props
查找常见的1
位,如上所述; >>> 0
确保数字为正数。结果针对props
进行了测试,确保公共位是props
中的所有位(如上面的第二个选项中所示)。如果设置了所有props
位,并且props
不为零,那么markers[m]
为setMap
- ped map
;否则,转到null
。
答案 2 :(得分:0)
var selections = ['0010', '1000', '0110', '1111'];
var getRequiredSelections = function (customerSelection) {
var customerSelectionInt = parseInt(customerSelection, 2);
if (customerSelectionInt) {
return selections.filter(function (binaryString) {
return parseInt(binaryString, 2) & customerSelectionInt;
});
} else {
return selections;
}
};
您可以像这样使用它:
getRequiredSelections('0010');
答案 3 :(得分:0)
但是,如果没有客户选项,请检查:0000我必须全部显示
在2的赞美中,-1是二进制的所有1
if (!props) props = -1;
准确测试二进制内容,同时使用&
和===
needle === (needle & haystack)
这意味着needle = 1001
haystack = 0001
中的false
是1001 & 0001
,即使0001
是 truthy function applyByFlag(flag, callbackTrue, callbackFalse) {
if (!flag)
flag = -1;
function nop() {}
if (!callbackTrue) callbackTrue = nop;
if (!callbackFalse) callbackFalse = nop;
boxes.forEach(function (e, i, a) {
if (flag & e) // not exact test
callbackTrue.call(e, e, i, a);
else
callbackFalse.call(e, e, i, a);
});
}
您可能不希望在您的情况下使用完全匹配
您可以编写一些代码来回调处理数组
e.props
当然,您可能希望调整测试以对抗{{1}}
答案 4 :(得分:0)
你的代码几乎就在那里;只需添加props
为零的附加检查:
for(var m=0; m < markers.length; m++) {
var show = (markers[m].props & props)>>>0===props || props == 0;
markers[m].setMap(show ? map : null);
}
markers[m].props & props
表达式将0
(如果不是props
的所有位匹配)或props
本身的值(如果props
的所有位}匹配)。
附加>>>0
会将表达式转换为无符号的32位整数值,但如果使用以下表达式则不需要它:
var show = (markers[m].props & props) || props == 0;