在lodash-remove中,javascript对象hash与lodash-foreach



我正试图从一个复杂对象中删除一些数据。

原始数据的格式如下。

let originData = 
[
{
name : exampleDepth1,
depth1Data : 
[
{
name : exampleDepth2,
depth2Data : 
[
{
code: 1234///will be delete from that data
},
...
]
},
...
]
},
....
]
let willbeDeletecode = [ 3, 100, 1234, 1000];

要删除的数组的名称为originDatadepth2Data数组中的code值,要删除的阵列的名称为willbeDeletecode

如果你不舒服,我很抱歉。

我试着用两种方法把它擦掉。

let deleteBook = {}
_.forEach(willbeDeletecode, (deleteCode) => {
deleteBook[`${deleteCode}`] = deleteCode;
})
_.remove(originData, (depth1) => {
_.remove(depth1.depth1Data, (depth2) => {
/*
// delete with object hash
_.remove(depth2.depth2Data, (eachDepth2Data) => {
return deleteBook[eachDepth2Data.code] === undefined
})
*/
/*
// delete with forEach
let ret = false;
_.remove(depth2.depth2Data, (eachDepth2Data) => {
_.forEach(willbeDeletecode, (deleteCode) => {
if(deleteCode === eachDepth2Data.code){
ret = true;
return false;
}
})
return ret
})
*/
return depth2.depth2Data.length === 0;
})
return depth1.depth1Data.length === 0;
})

我有两种不同的注释方式。

第一种方法是创建一个对象(deleteBook),插入willbeDeletecode的数据并将其用于lodash的移除。

第二种方法完全是通过forEach函数进行比较。

将上述方法重复1000次以进行基准测试。结果表明,第一种方法为100~200ms,第二种方法为500~700ms。

当然,willbeDeletecode大约是10,但我认为Object散列更快。但结果恰恰相反。

如果willbeDeletecode中有更多的变量,会有另一个结论吗?我想知道为什么会这样。

首选对象哈希。您也可以使用ES6Set来实现此目的。

这样的哈希解决方案应该更快。

在您的案例中没有看到这一点的一个原因是,代码的第一个变体删除了与其相反的。当相应的项应该被删除时,_remove回调应该返回一个真实的值,但是当值在应该删除的代码中是而不是时,代码返回true。您应该使用!==比较:

_.remove(depth2.depth2Data, (eachDepth2Data) => {
return deleteBook[eachDepth2Data.code] !== undefined
})

由于您有一个===,您可能有更多的删除正在进行,从而提供更长的执行时间。

最新更新