gpt4 book ai didi

javascript - 如何使用每个对象的所有属性来过滤对象数组以检查匹配项?

转载 作者:行者123 更新时间:2023-11-30 15:28:26 30 4
gpt4 key购买 nike

给定一个搜索字符串:

和这个对象数组:

[
{
name: 'Jane Smith',
address: '123 Main St, Boston, MA 01234',
telephone: {
primary: '1234567890',
secondary: '1112223333'
}
},
{
name: 'John Smith',
address: '333 Main St, New York, NY 56789',
telephone: {
primary: '2223334444',
secondary: '3334445555'
}
},
...
]

我们可以按名称过滤数组:

arr.filter(person => person.name.includes(search))

太棒了。如果我们仅通过每个对象的 name 属性进行搜索,那么效果很好。

过滤对象所有属性的最佳做法是什么?

我们是否必须做类似的事情:

arr.filter(person => 
person.name.includes(search) ||
person.address.includes(search) ||
person.telephone.primary.includes(search) ||
person.telephone.secondary.includes(search)
)

如果有多个属性,这将变得乏味且容易出错。

如果任何属性的值与搜索字符串匹配,是否可以过滤数组?

更新:

这非常适用于 person 对象的顶级属性。

.filter(person => {
for (let property in person) {
return String(person[property]).includes(search)
}
})

致力于寻找一个很好的解决方案,用于递归搜索本身可能是对象的属性。

最佳答案

在递归函数(我称之为deepIncludes)中使用Object.keysArray#some 来检查是否有任何属性(或子属性)包括搜索字符串。在这里,我使用 this 来存储搜索字符串,因为这允许您使用以下语法过滤您的人员数组:

let result = array.filter(deepIncludes, 'Search String')

function deepIncludes (object) {
return Object.keys(object).some(k => {
let v = object[k]
return (v && typeof v == 'object') ? deepIncludes.call(this, v) : String(v).includes(this)
})
}

let array = [
{
name: 'Jane Smith',
address: '123 Main St, Boston, MA 01234',
telephone: {
primary: '1234567890',
secondary: '1112223333'
}
},
{
name: 'John Smith',
address: '333 Main St, New York, NY 56789',
telephone: {
primary: '2223334444',
secondary: '3334445555'
}
}
]

// Usage:
console.log(
array.filter(deepIncludes, '3334445555') //=> [ { name: 'John Smith', ... } ]
)

关于javascript - 如何使用每个对象的所有属性来过滤对象数组以检查匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42603445/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com