当我想在作为数组传递给函数时跨某些字段进行搜索时,如何跨对象数组进行搜索。例如:
const src = [ { id:1, name: "name1", age: 25}, { id: 2, name: "name2", age: 33} ]
假设我只想搜索
name
和 age
等字段,而不是 id。我尝试过的代码
function contains(text, subStr) {
return text.includes(subStr);
}
const searchInData = (searchString, searchData) => {
const keyword = searchString.toLocaleLowerCase();
let filteredData = searchData;
if (keyword) {
filteredData = searchData?.filter((item) => {
const { name, age } = item;
return (
contains(name, keyword) ||
contains(age, keyword) ||
);
});
}
return filteredData;
};
如何将字段名称作为数组传递并仅搜索这些值。比如,
searchInData(searchString, searchData, fieldsForSearch)
我创建了一个函数来完成我认为你想要的事情:
const src = [ { id:1, name: "name1", age: 25}, { id: 2, name: "name2", age: 33} ]
function filterObjArr(fieldArr, src)
{
const result = src.reduce((acc, cur) =>
{
fieldArr.forEach(field =>
{
if(cur[field])
{
acc.push({[field]: cur[field]});
}
});
return acc;
},[]);
return result;
}
let res = filterObjArr(['name', 'age'], src);
console.log(res);
您可以迭代第三个参数中的键,并测试每个键是否具有该键名称的项目属性包含该字符串。您可以使用
some
来实现这一点。也许对参数使用剩余语法也很有趣:
function searchInData(searchString, searchData, ...fieldsForSearch) {
const keyword = searchString.toLocaleLowerCase();
// If no keys provided, search all of them
if (fieldsForSearch.length == 0) {
return searchData?.filter((item) =>
Object.values(item).some(value => String(value).includes(keyword))
);
}
// keys were provided: test those properties only
return searchData?.filter((item) =>
fieldsForSearch.some(field => Object.hasOwn(item, field)
&& String(item[field]).includes(keyword))
);
};
// demo
const src = [ { id:1, name: "name1", age: 25}, { id: 2, name: "name2", age: 33} ];
console.log(searchInData("name", src, "id", "age").length); // 0
console.log(searchInData("3", src, "id", "name").length); // 0
console.log(searchInData("3", src, "age", "name").length); // 1
console.log(searchInData("2", src, "age", "name").length); // 2
console.log(searchInData("u", src, "nonexisting key").length); // 0
console.log(searchInData("1", src).length); // 1