【发布时间】:2021-12-23 06:52:37
【问题描述】:
我有一个对象数组,例如:
[
{
"fName": "Jon",
"lName": "Doe",
"age": "30",
"shirtSize": "M"
},
{
"fName": "Jane",
"lName": "Foe",
"age": "25",
"shirtSize": "M"
},
...
]
我还有一个键列表,例如:
["age", "shirtSize"]
我想获取对象数组,并构建一个与键列表数组匹配的新对象数组,有效地过滤对象数组以仅具有我想要的键/值对。以上是例子,真实的数据集当然更啰嗦。我已经在下面的算法中强制使用它,并且正如预期的那样,由于我在地图中的循环,它根本不是很高效。我的结果是这样的:
[
{
"age": "30",
"shirtSize": "M"
},
{
"age": "25",
"shirtSize": "M"
},
...
]
我没有使用 lodash 之类的东西。如何提高此性能?
const data = [
{
"fName": "Jon",
"lName": "Doe",
"age": "30",
"shirtSize": "M"
},
{
"fName": "Jane",
"lName": "Foe",
"age": "25",
"shirtSize": "M"
}
];
const keyList = ["age", "shirtSize"];
const filteredDataset = data.map((elem) => {
let tempHolder = {};
for (let key of keyList) {
tempHolder[key] = elem[key];
}
return tempHolder;
});
return filteredDataset;
【问题讨论】:
-
我认为如果没有两个循环,或者至少相当于两个循环,你就无法做到这一点。
data的每个元素一个,keylist的每个元素一个。但是,您应该在映射中声明 tempHolder,否则您将一遍又一遍地将相同的对象添加到数组中。 -
“在地图内循环” - 按顺序排列,没有比这更好的了。但是,您的代码似乎有问题 - 例如
tempHolder似乎总是同一个对象。我认为您发布的结果并不是您从该代码中实际得到的结果。 -
此代码错误。由于
tempHolder不会为每个对象重新创建,因此它将仅输出一个对象代替两个对象的过滤结果。 -
谢谢大家,我的手写示例在错误的范围内声明了 tempHolder
标签: javascript node.js algorithm data-structures javascript-objects