gpt4 book ai didi

javascript - 使用 JavaScript 跟踪对象键的有效方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:57:26 24 4
gpt4 key购买 nike

我正在使用带有陷阱的 Proxy 对象来跟踪对象键,这样我就可以轻松地迭代和/或从对象中选择一个随机键,而性能开销很小。目前,我将添加的键存储在数组中。这对于插入和随机选择非常有效,但是当删除一个属性时,开销很大:

// Benchmark
var testObject = createProxy();

var start = performance.now();

for( var i = 0; i < 1e4; i++ )
testObject[Math.random() * 1e6 << 0] = true;
for( var i in testObject )
if( i[0] !== '_' )
delete testObject[ i ];

var end = performance.now();

var total = ( end - start );
console.log( 'Test took ' + total + ' ms' );

// Implementation
function createProxy() {
function keyTracker() {
const set = new Set();
function defineProperty( target, property, descriptor ) {
target[property] = descriptor.value;
if( property[0] === '_' ) return true;
if( set.has( property ) ) return true;

set.add( property );
target[ '__keys' ].push( property );
return true;
}
function deleteProperty( target, property ) {
if( property[ 0 ] === '_' ) return true;

delete target[ property ];
if( !set.delete( property ) ) return true;

target[ '__keys' ] = target[ '__keys' ].filter(
key => key !== property
);
return true;
}
return { defineProperty, deleteProperty };
}

var proxy = new Proxy(
Object.defineProperty( {}, '__keys', {
configurable: true,
enumerable: false,
writable: true,
value: []
} ), keyTracker() );

return proxy;
}

调用 Array.filter() 会随着对象中键的数量增长而呈指数增长。我正在寻找一种解决方案,让我不必调用它来删除单个元素。

有没有一种方法可以重新构建它以允许 O(1) 插入、随机选择和删除 key ?

最佳答案

您可以只使用拼接。它会让您的时间缩短 800-1000 毫秒。

       target[ '__keys' ].splice(target[ '__keys' ].indexOf(property), 1);

// Benchmark
var testObject = createProxy();

var start = performance.now();

for( var i = 0; i < 1e4; i++ )
testObject[Math.random() * 1e6 << 0] = true;
for( var i in testObject )
if( i[0] !== '_' )
delete testObject[ i ];

var end = performance.now();

var total = ( end - start );
console.log( 'Test took ' + total + ' ms' );

// Implementation
function createProxy() {
function keyTracker() {
const set = new Set();
function defineProperty( target, property, descriptor ) {
target[property] = descriptor.value;
if( property[0] === '_' ) return true;
if( set.has( property ) ) return true;

set.add( property );
target[ '__keys' ].push( property );
return true;
}
function deleteProperty( target, property ) {
if( property[ 0 ] === '_' ) return true;

delete target[ property ];
if( !set.delete( property ) ) return true;

target[ '__keys' ]
.splice(target[ '__keys' ].indexOf(property), 1);
return true;
}
return { defineProperty, deleteProperty };
}

var proxy = new Proxy(
Object.defineProperty( {}, '__keys', {
configurable: true,
enumerable: false,
writable: true,
value: []
} ), keyTracker() );

return proxy;
}

关于javascript - 使用 JavaScript 跟踪对象键的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51829020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com