观察:
- 设置操作可以理解为执行流中的快照。
- 我们没有找到明确的替代品。
-
Set 类 的元素没有可访问的索引。
-
Set class 是 Array class 的补充,在我们需要存储一个集合来应用基本加法的场景中很有用,
删除、检查和迭代操作。
我分享一些性能测试。尝试打开您的控制台并复制粘贴以下代码。
创建数组 (125000)
var n = 125000;
var arr = Array.apply( null, Array( n ) ).map( ( x, i ) => i );
console.info( arr.length ); // 125000
1.查找索引
我们比较了 Set 的 has 方法和 Array indexOf:
数组/indexOf (0.281ms) |设置/有 (0.053ms)
// Helpers
var checkArr = ( arr, item ) => arr.indexOf( item ) !== -1;
var checkSet = ( set, item ) => set.has( item );
// Vars
var set, result;
console.time( 'timeTest' );
result = checkArr( arr, 123123 );
console.timeEnd( 'timeTest' );
set = new Set( arr );
console.time( 'timeTest' );
checkSet( set, 123123 );
console.timeEnd( 'timeTest' );
2。添加新元素
我们分别比较Set和Array对象的add和push方法:
数组/推送 (1.612ms) |设置/添加 (0.006ms)
console.time( 'timeTest' );
arr.push( n + 1 );
console.timeEnd( 'timeTest' );
set = new Set( arr );
console.time( 'timeTest' );
set.add( n + 1 );
console.timeEnd( 'timeTest' );
console.info( arr.length ); // 125001
console.info( set.size ); // 125001
3.删除元素
在删除元素时,我们要记住 Array 和 Set 不是在相等的条件下开始的。数组没有原生方法,所以需要一个外部函数。
数组/deleteFromArr (0.356ms) |设置/删除 (0.019ms)
var deleteFromArr = ( arr, item ) => {
var i = arr.indexOf( item );
i !== -1 && arr.splice( i, 1 );
};
console.time( 'timeTest' );
deleteFromArr( arr, 123123 );
console.timeEnd( 'timeTest' );
set = new Set( arr );
console.time( 'timeTest' );
set.delete( 123123 );
console.timeEnd( 'timeTest' );
阅读全文here