【发布时间】:2017-07-04 07:36:27
【问题描述】:
我试图通过一个数组来过滤一个对象,得到一个对象数组。
像这样:
let obj =
{
"a.1":1,
"a.2":2,
"b.1":3,
"b.2":4,
"c.1":5,
"c.2":6
}
let array =
[
["a.1","b.1"],
["a"],
["b","c.1"]
]
let expectedResult =
[
{
"a.1":1,
"b.1":3,
},
{
"a.1":1,
"a.2":2,
},
{
"b.1":3,
"b.2":4,
"c.1":5
},
]
// this is what I came up with
const filterObjectByArray = (obj, arr) =>
Object.keys(obj)
.filter(ch => {
for (var index = 0; index < arr.length; index++)
if (ch.startsWith(arr[index]))
return true;
})
.reduce((ret, key) =>{
ret[key] = obj[key]
return ret
},{})
let result = array.map(arr => filterObjectByArray(obj, arr))
//kind of deepEqual
console.log(JSON.stringify(expectedResult) == JSON.stringify(result))
有没有更简单或更方便的方法来做到这一点?我需要经常执行此操作,并且我的对象将多达数百个条目,因此我在这里看到了潜在的瓶颈。
【问题讨论】:
-
我可能会看看 Lodash (lodash.com) 实用程序
-
这正是我会做的。如果您需要从中获得额外的速度,我可能会通过将功能方法展开为纯程序(即没有
filter和reduce,只有香草for)和基准测试。但是,我还建议首先进行基准测试,看看这是否像你担心的那样慢(如果它有几百个条目,它应该相当快,除非你想要每秒百万次)。你知道,“过早的优化是万恶之源”等等。 -
只当心
startsWith-a.15以a.1开头,我怀疑这可能不是你想要的。(ch + ".").startsWith(arr[index] + ".")更可靠(a.15.以a.开头,但不以a.1.开头)。 -
创建树可能会更高效,例如a:{1:2,2:3},b: ... 这样您可以更轻松地过滤。
-
@Amadan 感谢您的提示,我会调查一下
标签: javascript arrays performance sorting object