我正试图从一个复杂对象中删除一些数据。
原始数据的格式如下。
let originData =
[
{
name : exampleDepth1,
depth1Data :
[
{
name : exampleDepth2,
depth2Data :
[
{
code: 1234///will be delete from that data
},
...
]
},
...
]
},
....
]
let willbeDeletecode = [ 3, 100, 1234, 1000];
要删除的数组的名称为originData
的depth2Data
数组中的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
})
由于您有一个===
,您可能有更多的删除正在进行,从而提供更长的执行时间。