JavaScript:使用任意值的字符串匹配来过滤对象数组

问题描述 投票:0回答:1

我想创建一个函数,当给定一个字符串时,该函数将搜索数组中的每个对象以查找该字符串的任何匹配值。我有一个下面的函数,但想知道是否有更优雅的解决方案。

例如,如果我们有数组:

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 循环更好的东西!

javascript functional-programming
1个回答
1
投票

是的,有一个更优雅的解决方案,使用

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;
}

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.