Javascript 使用具有多个测试的筛选方法筛选对象数组
我想根据多个测试筛选一组对象。对于本例,如果键的值不为null,并且一个键的一个值小于90,我想过滤一个对象数组。我目前正在使用for循环执行此操作,如下所示:Javascript 使用具有多个测试的筛选方法筛选对象数组,javascript,Javascript,我想根据多个测试筛选一组对象。对于本例,如果键的值不为null,并且一个键的一个值小于90,我想过滤一个对象数组。我目前正在使用for循环执行此操作,如下所示: let filtered = [] for (let i = 0; i < articles.length; i++) { if (articles[i].title !== null && articles[i].title.length <= 90 && artic
let filtered = []
for (let i = 0; i < articles.length; i++) {
if (articles[i].title !== null && articles[i].title.length <= 90 &&
articles[i].date !== null &&
articles[i].image !== null &&
articles[i].description !== null &&
articles[i].link !== null) {
filtered.push(articles[i])
}
}
let filtered=[]
for(设i=0;i 如果(articles[i].title!==null&&articles[i].title.lengthyes过滤器可以做到这一点,它只需要一个函数并将其应用于数组中的每个项
array.filter(x=>x.title!=null&&…等)
本节中的示例与您正在做的基本相同请尝试:
articles.filter(article =>
Object.values(article).every(x => (x !== null))
&& article.title.length <= 90
)
.filter
是一个函数属性类型,它接受一个函数,它为每个项调用该函数。本质上,我们向它传递一个函数,而不是立即执行它,它可以在空闲时调用它。这有点像:
let a = alert;
我们没有调用alert
函数,我们只是将其保存到一个变量中。在.filter
的情况下,我们将其用作伪变量-一个参数。在内部,.filter
所做的全部工作是:
Array.prototype.filter(callbackFunc) {
newArr = [];
for (i=0;i<this.length;i++){
if (callbackFunc(this[i]) === false){ // We're calling `callbackFunc` manually, for each item in the loop.
newArr.push(this[i]);
}
}
return newArr;
}
最后,我们只需要澄清每个都做什么。这是functional JS的另一个例子,函数接受回调函数作为参数。内部代码如下所示:
Array.prototype.every(callbackFunc) {
for (i=0;i<this.length;i++){
if (callbackFunc(this[i]) === false){ // We're calling `callbackFunc` manually, for each item in the loop.
return false;
}
}
// In JS, returning a value automatically stops execution of the function.
// So this line of code is only reached if `return false` is never met.
return true;
}
Array.prototype.every(callbackFunc){
对于(i=0;i而言,filter
方法就是这样做的:它接受一个条件(就像if
语句中的条件一样),并在条件满足时将其添加到数组中。实际上,您的代码几乎与filter
语法完全匹配:
let filtered = articles.filter(article =>
article.title !== null
article.title.length <= 90 &&
article.date !== null &&
article.image !== null &&
article.description !== null &&
article.link !== null);
let filtered=articles.filter(article=>
article.title!==null
article.title.length可能是最容易扩展和最简洁的答案!这是一个很好的答案:)为什么你要使用some
方法而不是every
?我现在正在做一个解释@fellinlovewithaman,我只是想先做FGIW.@fellinlovewithaman哦,这是一个很好的发现-根据你原来的代码,我确实认为应该是every
,因为有些只需要至少一个truthy
value,而您希望所有这些都是truthy
@MatthewLiu-true,固定的。
let values = Object.values(article); // Get the value of all of the keys in the object
function checkFunction(item){ // Define a helper function
return (x !== null); // Which returns if an item is _not_ null.
}
let result = values.every(checkFunction); // Run `checkFunction` on every item in the array (see below), and ensure it matches _all_ of them.
Array.prototype.every(callbackFunc) {
for (i=0;i<this.length;i++){
if (callbackFunc(this[i]) === false){ // We're calling `callbackFunc` manually, for each item in the loop.
return false;
}
}
// In JS, returning a value automatically stops execution of the function.
// So this line of code is only reached if `return false` is never met.
return true;
}
let filtered = articles.filter(article =>
article.title !== null
article.title.length <= 90 &&
article.date !== null &&
article.image !== null &&
article.description !== null &&
article.link !== null);