Array.prototype.filter(Boolean)

ES5 中的数组有这个方法:Array.prototype.filter ,具体使用参考MDN,这里讲一个特殊应用:

回顾下语法:

new_array = arr.filter(callback[, thisArg]);

callback
用来测试数组的每个元素的函数。调用时使用参数 (element, index, array)。
返回true表示保留该元素(通过测试),false则不保留。

逻辑上很简单, callback 返回 true 就保留,否则不保留,但是有的时候还可以这么用,如图:

Array.prototype.filter(Boolean)

image

仔细想想逻辑上没有问题,应该等价于

image

然后,发现一个新的应用,把下面这个转成数组:

const    medicineEntities = { 1: { name: '' }, 2: { name: '' }, 3: { name: '' }, ids: [1, 2], invalidIds: [3] ;

有一种解法:

medicines = Object.assign([], medicineEntities).filter(Boolean);

仔细理解没问题!

下面分析:

Object.assign 把 medicineEntities 的属性赋值给了 [],这样的结果就是,

因为数组本身也是对象,所以

1、属性名为数字的属性赋值成功,计入 length

2、属性名不为数字的赋值成功,不计入 length

3、因为没有 0 属性,所以 0 属性为 undefined

最终,数字属性成为数组的下标,值为数组的值,第一项为 undefined ,所以被 filter(Boolean) 过滤掉了,后面的非数值型属性变成了数组的属性,不过不计入下标和 length

原文地址:https://www.cnblogs.com/xianshenglu/p/8297523.html