我想创建一个函数,当给定一个字符串时,该函数将搜索数组中的每个对象以查找该字符串的任何匹配值。我有一个下面的函数,但想知道是否有更优雅的解决方案。
例如,如果我们有数组:
data = [
{name: "Jordan", age: "forty two"},
{name: "Maya", age: "thirty"}
]
使用我的函数(我希望有一个更简洁的选择)
searchAllObject = (data, letter) => {
let subsetData = []
let indexedObjects = []
let singleObject = []
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < Object.values(data[i]).length; j++) {
singleObject.push(Object.values(data[i])[j].toLowerCase().includes(letter.toLowerCase()))
}
indexedObjects = singleObject.reduce((a, b) => a || b, false)
indexedObjects ? subsetData.push(data[i]) : null
singleObject = []
}
return subsetData
}
我可以使用我的函数来搜索
m
,它将仅返回 data[1]
,而 j
将仅返回 data[0],而 y
将返回两个元素:
searchAllObject(data, 'j')
[{name: "Jordan", age: "forty two"}]
searchAllObject(data, 'm')
[{name: "Maya", age: "thirty"}]
searchAllObject(data, 'y')
[
{name: "Jordan", age: "forty two"},
{name: "Maya", age: "thirty"}
]
注意 - 我的函数确实有效,但我想知道互联网是否可以帮助我找到比嵌套 for 循环更好的东西!
filter()
和 some()
。
最终您想要列表的子集,因此
filter()
是您的主要操作。然后,您需要确定数组中的每个项目是否应包含在结果中。如果该对象的任何值(或 some()
表示至少一个)(这里是 Object.values()
发挥作用)包含(或 includes()
)搜索词,则应包含该搜索词。
const data = [
{ name: "Jordan", age: "forty two" },
{ name: "Maya", age: "thirty" },
];
function searchAllObjectsCaseInsensitive(data, searchTerm) {
const lowerCaseSearchTerm = searchTerm.toLowerCase();
return data.filter((obj) =>
Object.values(obj).some((val) =>
val.toLowerCase().includes(lowerCaseSearchTerm)
)
);
}
console.log(searchAllObjectsCaseInsensitive(data, 'j'))
console.log(searchAllObjectsCaseInsensitive(data, 'm'))
console.log(searchAllObjectsCaseInsensitive(data, 'y'))
/* Stackoverflow: show only console */
.as-console-wrapper {
max-height: 100% !important;
top: 0;
}