javascript - 如何通过多个属性过滤对象数组?
问题描述
对于这个问题,我自己已经得到了我想要的答案,但是我的解决方案很长并且有多个循环。
所以我在这里问是因为我想要一个替代解决方案。
我想要的是我想通过 3 个属性过滤数组。条件是如果用户填写属性函数需要搜索该属性。如果用户将属性留空,我们可以跳过过滤该属性
这是我的示例数据
let arrays = [
{
id: "29",
title: "Race event 2018",
solutionType: "B2C, B2B, Marketing",
industry: "Retail",
integration: "C5",
},
{
id: "30",
title: "Foundation",
solutionType: "B2C, B2B, CMS, ",
industry: "Distribution",
integration: "D365",
},
{
id: "31",
title: "More disruption",
solutionType: "CMS, Marketing, ",
industry: null,
integration: null,
},
{
id: "36",
title: "Building blocks",
solutionType: "B2C, Marketing, ",
industry: "Distribution",
integration: "C5",
},
{
id: "37",
title: "Delicious icecream",
solutionType: "B2B, CMS, Marketing, ",
industry: "Distribution",
integration: "CRM",
},
];
这是搜索功能
我想要的是如果用户不提供要搜索的属性我想返回原始数组,如果用户不填写solutionToSearch
我想搜索匹配的对象industryToSearch
& integrationToSearch
,
同时,如果用户不填写industryToSearch
并将其留空,我想搜索对象。与solutionToSearch
&integrationToSearch
属性匹配,ViceVersa 用于所有 3 个值
let solutionToSearch = "B2B";
let industryToSearch = " ";
let integrationToSearch = "C5";
const filterTheArrayFunc = () => {
let answerArrayA = [];
let answerArrayB = [];
let answerArrayC = [];
for (let i = 0; i < arrays.length; i++) {
if (solutionToSearch === "" || solutionToSearch === " ") {
answerArrayA = arrays;
} else {
for (let y = 0; y < arrays[i].solutionType.split(",").length; y++) {
if (arrays[i].solutionType.split(",")[y].trim() === solutionToSearch)
answerArrayA.push(arrays[i]);
}
}
}
for (let i = 0; i < answerArrayA.length; i++) {
if (industryToSearch === "" || industryToSearch === " ") {
answerArrayB = answerArrayA;
} else {
if (answerArrayA[i].industry === industryToSearch) {
answerArrayB.push(answerArrayA[i]);
}
}
}
for (let i = 0; i < answerArrayB.length; i++) {
if (integrationToSearch === "" || integrationToSearch === " ") {
answerArrayC = answerArrayB;
} else {
if (answerArrayB[i].integration === integrationToSearch) {
answerArrayC.push(answerArrayB[i]);
}
}
}
console.log(answerArrayC);
};
filterTheArrayFunc();
如您所见,我正在循环多次并制作了很多不必要的变量。我想改进我的代码,有人可以帮忙吗?
解决方案
查看Array.Filter ..
let arrays = [
{
id: "29",
title: "Race event 2018",
solutionType: "B2C, B2B, Marketing",
industry: "Retail",
integration: "C5",
},
{
id: "30",
title: "Foundation",
solutionType: "B2C, B2B, CMS, ",
industry: "Distribution",
integration: "D365",
},
{
id: "31",
title: "More disruption",
solutionType: "CMS, Marketing, ",
industry: null,
integration: null,
},
{
id: "36",
title: "Building blocks",
solutionType: "B2C, Marketing, ",
industry: "Distribution",
integration: "C5",
},
{
id: "37",
title: "Delicious icecream",
solutionType: "B2B, CMS, Marketing, ",
industry: "Distribution",
integration: "CRM",
},
];
let solutionToSearch = " ";
let industryToSearch = " ";
let integrationToSearch = "C5";
const filterTheArrayFunc = () => {
return arrays.filter(obj=>
(!solutionToSearch.trim() || (obj.solutionType || "").includes(solutionToSearch.trim())) &&
(!industryToSearch.trim() || (obj.industry || "").includes(industryToSearch.trim())) &&
(!integrationToSearch.trim() || (obj.integration || "").includes(integrationToSearch.trim()))
);
};
var filtered = filterTheArrayFunc();
console.log(filtered);
您可以通过传递参数而不是依赖外部范围的变量来进一步改进这一点。此外,您可以按属性名称进行过滤,而不是创建一个新变量来为每个属性名称定义搜索参数。
let arrays = [
{
id: "29",
title: "Race event 2018",
solutionType: "B2C, B2B, Marketing",
industry: "Retail",
integration: "C5",
},
{
id: "30",
title: "Foundation",
solutionType: "B2C, B2B, CMS, ",
industry: "Distribution",
integration: "D365",
},
{
id: "31",
title: "More disruption",
solutionType: "CMS, Marketing, ",
industry: null,
integration: null,
},
{
id: "36",
title: "Building blocks",
solutionType: "B2C, Marketing, ",
industry: "Distribution",
integration: "C5",
},
{
id: "37",
title: "Delicious icecream",
solutionType: "B2B, CMS, Marketing, ",
industry: "Distribution",
integration: "CRM",
},
];
function filterTheArrayFunc(arr, params){
var filter_keys = Object.keys(params);
return arrays.filter(obj=>{
return filter_keys.reduce((match, key) => {
let value = params[key].trim();
if(!match) return false;
if(!obj[key] || !obj[key].includes(value)) return false;
return match;
}, true);
});
};
var filtered = filterTheArrayFunc(arrays, {
solutionType: "B2B",
integration: "C5"
});
console.log(filtered);
推荐阅读
- r - R中的Wilcox.test - 没有足够的x观察
- java - 在另一个 Jframe 上方显示 Jframe
- mysql - 查询表中的数据 [mySQL]
- r - R中的个人数据库连接包
- sql-server - 从 SQL Server 中的 SELECT 结果中获取最频繁的值
- javascript - 使用 android/IOS 应用程序发送 whatsapp 消息
- javascript - 将具有多个父级的图形数据转换为 jstree Javascript 的数据
- android - 无法发送 POST
- c - VS Code:没有这样的文件或目录
- spring - 禁用 Open Service Broker API 的 ServiceBrokerExceptionHandler