给定搜索字符串:
[
{
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)
)
属性,那么这很有效。
跨对象的所有属性进行过滤的最佳做法是什么?
我们必须做以下事情:
.filter(person => {
for (let property in person) {
return String(person[property]).includes(search)
}
})
如果有多个属性,这将变得乏味且容易出错。
如果任何属性的值与搜索字符串匹配,有没有办法过滤数组?
更新
这适用于person对象的顶级属性。
UNION ALL
努力寻找一个很好的解决方案来递归搜索可能本身就是对象的属性。
答案 0 :(得分:1)
在递归函数(我称之为class Cipher():
def __init__(self, key=bytearray(b'abc123y;')):
self.setKeys(key)
def setKeys(self, key):
if isinstance(key, bytearray) and len(key) >= 8:
self.encrKey = key[:8]
self.decrKey = self.encrKey
self.decrKey.reverse()
print("Encrypt: ", self.encrKey)
print("Decrypt: ", self.decrKey)
return True
else:
return False
In [13]: cipher = Cipher()
Encrypt: bytearray(b';y321cba')
Encrypt: bytearray(b';y321cba')
In [14]: cipher.decrKey.reverse()
In [15]: cipher.decrKey
Out[15]: bytearray(b'abc123y;')
)中使用Object.keys
和Array#some
来检查是否有任何属性(或子属性)包含搜索字符串。在这里,我使用了deepIncludes
来存储搜索字符串,因为这样您就可以使用以下语法this
使用您的数组:
filter
let result = array.filter(deepIncludes, 'Search String')
答案 1 :(得分:1)
您可以将JSON.stringify
与replacer
参数一起用作遍历对象的方法。
function search(obj, str) {
var found = false;
JSON.stringify(obj, (key, value) => {
if (!found && typeof value === 'string' && value.includes(str)) found = true;
else return value;
});
return found;
}
答案 2 :(得分:0)
最后我选择了接近这个的东西:
function search (obj, text) {
for (let prop in obj) {
if (String(obj[prop]).includes(text)) {
return true
} else if (typeof obj[prop] === 'object') {
return search(obj[prop], text)
}
}
}
用法:
.filter(person => search(person, text))
<强>更新强>
for...in
方法对我的用例不起作用。我不确定为什么,但是没有搜索到某些键。
使用Object.keys
方法非常有效。
function search (obj, text) {
return Object.keys(obj).some(k =>
typeof obj[k] === 'object'
? search(obj[k], text)
: String(obj[k]).includes(text)
)
}
(相同用法)