Javascript 用数组过滤对象最有效的方法是什么?

Javascript 用数组过滤对象最有效的方法是什么?,javascript,arrays,performance,sorting,object,Javascript,Arrays,Performance,Sorting,Object,我试图通过数组过滤一个对象,得到一个对象数组 像这样: let obj= { “a.1”:1, “a.2”:2, “b.1”:3, “b.2”:4, “c.1”:5, “c.2”:6 } 让数组= [ [“a.1”、“b.1”], [“a”], [“b”、“c.1”] ] 设expectedResult= [ { “a.1”:1, “b.1”:3, }, { “a.1”:1, “a.2”:2, }, { “b.1”:3, “b.2”:4, “c.1”:5 }, ] //这就是我想到的 常量fi

我试图通过数组过滤一个对象,得到一个对象数组

像这样:

let obj=
{
“a.1”:1,
“a.2”:2,
“b.1”:3,
“b.2”:4,
“c.1”:5,
“c.2”:6
}
让数组=
[
[“a.1”、“b.1”],
[“a”],
[“b”、“c.1”]
]
设expectedResult=
[
{
“a.1”:1,
“b.1”:3,
},
{
“a.1”:1,
“a.2”:2,
},
{
“b.1”:3,
“b.2”:4,
“c.1”:5
},
]
//这就是我想到的
常量filterObjectByArray=(obj,arr)=>
对象键(obj)
.filter(ch=>{
对于(var指数=0;指数{
ret[key]=obj[key]
回程网
},{})
让result=array.map(arr=>filterObjectByArray(obj,arr))
//有点像

console.log(JSON.stringify(expectedResult)=JSON.stringify(result))
我将创建一个“base”(字母)到“real”键的单类型映射,然后在创建对象时使用它将字母转换为real键

const obj={
“a.1”:1,
“a.2”:2,
“b.1”:3,
“b.2”:4,
“c.1”:5,
“c.2”:6
};
常量数组=[
[“a.1”、“b.1”],
[“a”],
[“b”、“c.1”]
];
const getBaseKey=(key)=>key.match(/^[a-z]+/)[0];//找到钥匙的底部-字母。如果只有一个字母,可以使用键[0]
/**根据关键点的基础创建关键点的一次性贴图**/
const oobjKeysMap=Object.keys(obj).reduce((map,key)=>{
const baseKey=getBaseKey(key);
const curr=map.get(baseKey)| |[];
电流推送(键);
返回map.set(baseKey,curr);
},新地图());
const result=array.map((sub)=>//迭代数组
[].concat(…sub.map((k)=>obj中的k?k:oobjKeysMap.get(getBaseKey(k))//创建最少的“真实”键
.reduce((ret,key)=>{//创建对象
ret[key]=obj[key];
返回ret;
}, {})
);

控制台日志(结果)我可能会看看Lodash()实用程序,这正是我应该做的。如果您需要从中挤出额外的速度,我可能会将功能方法展开为纯粹的程序方法(即不使用
过滤器
减少
,只使用vanilla
进行测试)和基准测试。然而,我也建议首先进行基准测试,看看它是否像你担心的那样慢(如果是几百个条目,它应该相当快,除非你想要每秒百万次)。你知道,“过早的优化是万恶之源”等等。只有当心
startsWith
-
a.15
a.1
开始,我怀疑这可能不是你想要的<代码>(ch+“).startsWith(arr[index]+”)
更可靠(
a.15.
a.
开头,但不以
a.1.
开头)。创建树可能更有效,例如a:{1:2,2:3},b:。。。所以你可以更容易地过滤。@Amadan谢谢你的提示,我会调查的