Javascript 使用具有多个测试的筛选方法筛选对象数组

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

我想根据多个测试筛选一组对象。对于本例,如果键的值不为null,并且一个键的一个值小于90,我想过滤一个对象数组。我目前正在使用for循环执行此操作,如下所示:

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);