【问题标题】:Array.every function isn't running on all elements of ObjectArray.every 函数并未在 Object 的所有元素上运行
【发布时间】:2019-08-09 11:12:59
【问题描述】:

我正在尝试使用以下代码在 temp1 内部搜索是否有任何 具有字符串 "processado"

let temp1 = [{
    "id":7089,
    "value":"R$ 50,00",
    "name":"Daiany Nascimento",
    "date":"18/03/2019",
    "type":"Cobrança",
    "status":{
        "status":"Paga",
        "icon":"paid"
    },
    "credit_release_date":"Não Processado",
    "credit_release_description":"— — — —"
}]

let b = []

temp1.forEach((a,index_a) => { 
Object.values(a).every((value,index,array) => {
    let expression = new RegExp("processado", "i") //expression to search
    if (typeof value == "object") {
      Object.values(value).every(valueOfObject => {    
        if (expression.test(valueOfObject)) {
          b.push(temp1[index_a])
          return false;
        } else {
          return true
        }
      })
    }
    else if (expression.test(value)){ 
      b.push(temp1[index_a])
      return false
    }
      else {
      return true
    }
  })
})

但是,数组 b 仍然为空。如果我尝试搜索字符串 "Cobrança",则 array b 会被填充,这是应该的。我认为,如果我尝试搜索存储在 keys status key 之后的 values,就会出现问题.

【问题讨论】:

  • 只是一个建议:对于您的用例,Arrays 'find' 方法似乎是适合使用的方法。有什么理由在这里使用“每个”吗?

标签: javascript ecmascript-6 ecmascript-5 ecmascript-2017


【解决方案1】:

你需要在if (typeof value == "object")里面return Object.values(value).every(valueOfObject....

let temp1 = [{"id":7089,"value":"R$ 50,00","name":"Daiany Nascimento","date":"18/03/2019","type":"Cobrança","status":{"status":"Paga","icon":"paid"},"credit_release_date":"Não Processado","credit_release_description":"— — — —"}]

let b = []

temp1.forEach((a,index_a) => { 
Object.values(a).every((value,index,array) => {
    let expression = new RegExp("processado", "i") //expression to search
    if (typeof value == "object") {
      return Object.values(value).every(valueOfObject => {    
        if (expression.test(valueOfObject)) {
          b.push(temp1[index_a])
          return false;
        } else {
          return true
        }
      })
    }
      else if (expression.test(value)){ 
      b.push(temp1[index_a])
      return false
      }
      else {
      return true
      }
  })
})
console.log(b)

一种更简单、更简洁的方法是使用递归以及filter()some()every() 在这里对我没有任何意义

let temp1 = [{"id":7089,"value":"R$ 50,00","name":"Daiany Nascimento","date":"18/03/2019","type":"Cobrança","status":{"status":"Paga","icon":"paid"},"credit_release_date":"Não Processado","credit_release_description":"— — — —"}]

function check(obj,regex){
  return Object.values(obj).some(x =>{
      let y;
      if(typeof x === "object") y = check(x,regex);
      return y || regex.test(x);
   });
}

let b = temp1.filter(x => check(x,/Processado/i))
console.log(b)

【讨论】:

    【解决方案2】:

    为什么不考虑递归来检查任何值是否是对象?我认为它可以缩短代码并更直接。

    另外,对我来说Array.prototype.some 在这种情况下比Array.prototype.every 更有意义(除非我遗漏了什么):

    const temp1 = [{
      "id": 7089,
      "value": "R$ 50,00",
      "name": "Daiany Nascimento",
      "date": "18/03/2019",
      "type": "Cobrança",
      "status": {
        "status":"Paga",
        "icon":"paid"
      },
      "credit_release_date": "Não Processado",
      "credit_release_description": "— — — —"
    }];
    
    const b = [];
    
    const expression = new RegExp('processado', 'i');
    
    const hasExpr = obj => Object.values(obj).some((value, i) => {
      if (typeof value === 'object')
        return hasExpr(value);
      return expression.test(value);
    });
    
    temp1.forEach(item => {
      if (hasExpr(item))
        b.push(item);
    });
    
    console.log(b);

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2021-01-13
      • 2011-08-02
      • 2017-02-02
      • 2016-11-04
      • 2022-01-17
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多