我知道有类似的问题,但是迄今为止没有一个能够帮助我 - 从字符串数组过滤对象数组需要您知道要匹配的键值对,这个问题也同样如此。在这里
我不太确定我做错了什么或者如何修复这个函数以使其正常工作。
任何帮助将不胜感激。
假设我有一个对象数组,像这样...
let users = [
{
name: 'Steve',
age: 42,
pets: {
dog: 'spike';
},
favouriteFood: 'apples'
},
{
name: 'Steve',
age: 32,
pets null
favouriteFood: 'icecream'
},
{
name: 'Jason',
age: 31,
pets: null
favouriteFood: 'tacos'
},
{
name: 'Jason',
age: 31,
pets: {
cat: 'Jerry'
},
favouriteFood: 'bread'
},
]
现在,我想能够通过匹配任何对象键中的字符串来过滤用户数组。例如,我想过滤掉名字不是 'steve' 的人 - 请记住,我可能还想过滤掉任何不是 42 岁或最喜欢食物不是 'apples' 的人。
filter(term) {
return objects.filter(x => {
for(let key of Object.keys(x)) {
if(typeof(x[key]) === 'object') {
return JSON.stringify(x[key]).toLowerCase().includes(t);
} else {
return x[key].toString().toLowerCase().includes(t);
}
}
});
}
现在这个函数可以工作,但只能针对单个筛选条件。
因此,如果我运行filter('steve')
,我将得到
users = [
{
name: 'Steve',
age: 42,
pets: {
dog: 'spike';
},
favouriteFood: 'apples'
},
{
name: 'Steve',
age: 32,
pets null
favouriteFood: 'icecream'
}
]
如果我想要过滤掉最喜欢食用苹果的Steve,该怎么办呢?
我尝试通过更新函数来循环遍历术语数组,并根据数组中所有字符串进行筛选。
所以我已经尝试了:
function filter(terms) {
return term.forEach((t) => {
return objects.filter(x => {
for(let key of Object.keys(x)) {
if(typeof(x[key]) === 'object') {
return JSON.stringify(x[key]).toLowerCase().includes(t);
} else {
return x[key].toString().toLowerCase().includes(t);
}
}
});
});
但是当我运行 filter(['steve', 'apples'])
时,结果却是 undefined
。
我的期望结果应该是
users = [
{
name: 'Steve',
age: 42,
pets: {
dog: 'spike';
},
favouriteFood: 'apples'
}
]
我不太确定我做错了什么或者如何修复这个函数以使其正常工作。
任何帮助将不胜感激。