Функция Array.every не работает на всех элементах Object - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь найти внутри 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", массив b будет заполнен, как и должно быть. Я думаю, что если я попытаюсь найти значения , которые хранятся на ключах после статусной клавиши , что-то не так.

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Вам нужно return Object.values(value).every(valueOfObject.... внутри if (typeof value == "object")

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)
1 голос
/ 19 марта 2019

Почему бы не рассмотреть рекурсию, чтобы проверить, являются ли какие-либо значения объектами?Я думаю, что это может сократить код и быть немного более простым.

Кроме того, для меня 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);
...