使用对象谓词数组的lodash过滤器删除结果数据中的属性的更好方法是什么



工作代码笔链接

可用样本数据:

var cr_data = [
{
timestamp: "2020-12-29T11:45:57-08:00",
data: ["a", "b", "c"],
local: false,
source: true,
x_obj: ["5a9b320a-c720-44d1-8f27-288533510f1f"],
y_obj: "5e89a36f-de39-4552-af2b-8dd73feed692"
},
{
timestamp: "2020-11-29T11:45:57-08:00",
data: ["a", "b", "c"],
local: true,
source: false,
x_obj: [
"6a9b320a-c720-44d1-8f27-288533510f1f",
"7a9b320a-c720-44d1-8f27-288533510f1f"
],
y_obj: "6e89a36f-de39-4552-af2b-8dd73feed692"
}
];

适用于上述数据的可用筛选器。filter_obj应该匹配所有需要与提供的数据匹配的给定属性值:

var filter_obj = {
local: true,
x_obj: [
"6a9b320a-c720-44d1-8f27-288533510f1f",
"7a9b320a-c720-44d1-8f27-288533510f1f"
],
y_obj: "6e89a36f-de39-4552-af2b-8dd73feed692"
};

使用lodash执行筛选以从数据中筛选对象。还有一个条件是过滤对象中的某些属性需要删除:在本例中,结果对象不应具有x_objy_obj。找出进行这种过滤的方法。

var data = _.filter(cr_data, filter_obj);
var omittAttr = function (item) {
return _.omit(item, ["x_obj", "y_obj"]);
};
data = _.map(data, omittAttr);
console.log(data);

结果数据看起来像:

[{
timestamp: "2020-11-29T11:45:57-08:00",
data: ["a", "b", "c"],
local: true,
source: false
}]

我已经对这个对象进行了多次迭代,其中一次迭代使用了_.filter&另一个使用.map来移除属性。它看起来并不是用lodash进行过滤的有效方法。

如何消除多次迭代,并使用lodash以更简单的方式进行?没有必要用炉灰做这个过滤器。任何简单的javascript方式也可以。

我们非常感谢所有的建议。谢谢

据我所知,唯一的改进可能是使用Javascript的Array.map方法在一行中获得结果data

var cr_data = [{
timestamp: "2020-12-29T11:45:57-08:00",
data: ["a", "b", "c"],
local: false,
source: true,
x_obj: ["5a9b320a-c720-44d1-8f27-288533510f1f"],
y_obj: "5e89a36f-de39-4552-af2b-8dd73feed692"
},
{
timestamp: "2020-11-29T11:45:57-08:00",
data: ["a", "b", "c"],
local: true,
source: false,
x_obj: [
"6a9b320a-c720-44d1-8f27-288533510f1f",
"7a9b320a-c720-44d1-8f27-288533510f1f"
],
y_obj: "6e89a36f-de39-4552-af2b-8dd73feed692"
}
];
var filter_obj = {
local: true,
x_obj: [
"6a9b320a-c720-44d1-8f27-288533510f1f",
"7a9b320a-c720-44d1-8f27-288533510f1f"
],
y_obj: "6e89a36f-de39-4552-af2b-8dd73feed692"
};
var data = _.filter(cr_data, filter_obj).map(function(el) {
return {
timestamp: el.timestamp,
data: el.data,
local: el.local,
source: el.source
}
});
console.log(data);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>

这将通过数据的迭代次数减少到1x,尽管我不知道性能,但需要测试

const filter = (data, filter) => {
return data.filter((obj) => {
return Object.keys(filter).every((key) => obj[key] === filter[key]);
});
}

最新更新