在下面的方法中,
self.search = (obj, search) => {
...
第二个参数,search
是一个搜索字符串数组。第一个是对象。
该算法将用于 filter
方法,如果对象包含任何搜索字符串,该方法返回 true
。
self.search = (obj, search) => {
return Object.keys(obj).some(k =>
typeof obj[k] === 'object'
? self.search(obj[k], search)
: search.some(v => String(obj[k]).includes(v))
)
}
因此,例如,给定以下对象:
{
name: 'Peter',
phone: {
primary: 5556667777,
mobile: 1112223333
}
}
self.search
将为 search
参数的以下值返回 true:
['宠物']
['宠物', '111']
['Pet', 'asdf']
问题
self.search
如何更改为仅当 search
数组的每个 元素被对象包含时才返回 true?
本质上,['Pet', 'asdf']
应该返回 false
。
更新
当搜索字符串数组跨级别时,将 some
替换为 every
不起作用。
// `['Pet']` correctly returns true
// `['Pet', '111']` returns false when it should return true
// `['Pet', 'asdf']` correctly returns false
self.search = (obj, search) => {
return Object.keys(obj).some(k =>
typeof obj[k] === 'object'
? self.search(obj[k], search)
: search.every(v => String(obj[k]).toLowerCase().includes(v))
)
}
最佳答案
您可以对数组的每个项目使用单一搜索功能和元搜索。
var search = (obj, v) => Object.keys(obj).some(k => typeof obj[k] === 'object' ? search(obj[k], v) : obj[k].toString().includes(v)),
findAll = (obj, array) => array.every(a => search(obj, a)),
obj = { name: 'Peter', phone: { primary: 5556667777, mobile: 1112223333 } };
console.log(findAll(obj, ['Pet', '99'])); // false
console.log(findAll(obj, ['Pet'])); // true
console.log(findAll(obj, ['Pet', '111'])); // true
console.log(findAll(obj, ['Pet', 'asdf'])); // false
关于javascript - 如果对象包含字符串数组的每个元素,则返回 true 的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42626339/