Javascript中的布尔数组掩码

时间:2017-08-10 05:41:52

标签: javascript arrays numpy

来自Python和Numpy,我发现自己经常使用的典型功能是布尔掩码。

这是Python中的一个例子:

>>> mylist = np.array([50, 12, 100, -5, 73])
>>> mylist == 12
array([False, True, False, False, False])  # A new array that is the result of ..
                                           # .. comparing each element to 12
>>> mylist > 0
array([True, True, True, False, True])     # A new array that is the result of ..
                                           # .. comparing each element to 0
>>> mylist[mylist == 12]
array([12])                                # A new array of all values at indexes ..
                                           # .. where the result of `mylist == 12` is True

>>> mask = mylist != 100                   # Save a mask
>>> map(foo, mylist[mask])                 # Apply `foo` where the mask is truthy

通常,当np.array被另一个相同大小的数组索引时,会返回一个新数组,其中包含掩码数组值为真的那些索引处的元素。

我可以在Javascript中使用Array.prototype.mapArray.prototype.filter做类似的事情,但它更详细,我的面具也会被销毁。

-> mylist = [50, 12, 100, -5, 73]
-> mylist.map(item => item == 12)
<- [false, true, false, false, false]      // mylist == 12

-> mylist.filter(item => item == 12)
<- [12]                                    // mylist[mylist == 12]

-> mask = mylist.map(item => item == 12)
-> mylist.filter(item => mask.unshift())
<- [12]                                    // mylist[mask]

-> mask
<- []                                      // Mask isn't reusable

是否有更好的方法在javascript中对数组应用蒙版,或者我是不是每次都使用filtermap制作蒙版副本?

1 个答案:

答案 0 :(得分:3)

过滤器 map 都会创建新数组,因此它们很好。但是,您使用 unshift 似乎是因为您需要索引而不是值。您可以在通话中传递索引:

&#13;
&#13;
var mylist = [50, 12, 100, -5, 73];
var mask = mylist.map(item => item == 12);
var newlist = mylist.filter((item, i) => mask[i]);

console.log(newlist);
&#13;
&#13;
&#13;

或者如果你不想传递多于一个值,你可以编写自己的 maskFilter 方法,而不仅仅是一个掩码:

&#13;
&#13;
Array.prototype.maskFilter = function(mask) {
  return this.filter((item, i) => mask[i]);
}

var mylist = [50, 12, 100, -5, 73];
var mask = mylist.map(item => item == 12);
var newlist = mylist.maskFilter(mask);


console.log(newlist); // [12]
console.log(mylist);  // untouched 
&#13;
&#13;
&#13;