TheWebs
TheWebs

Reputation: 12913

Check if nested arrays in object contains empty values

Consider the following object:

{
  "params": {
    "time_to_diagnosis": [
      {
        "field": "date_of_diagnosis",
        "value": ""
      },
      {
        "field": "date_of_symptom_onset",
        "value": "2019-09-01"
      }
    ],
    "time_since_onset": [
      {
        "field": "date_of_symptom_onset",
        "value": "2019-09-01"
      }
    ]
  }
}

As you can tell this is a object , of objects with arrays that them selves contains objects.

As you can see some keys are empty.

The idea is that if there are no empty keys in the arrays containing objects, then return true, else return false.

Heres what I wrote:

const isParamsInAjaxParamsEmpty = (paramsForAjaxCall) => {
  for (const key in paramsForAjaxCall) {
    for (const nestedKey in paramsForAjaxCall[key]) {
      const params = paramsForAjaxCall[key];

      if (params[nestedKey] === "") {
        return true;
      }
    }
  }

  return false;
}

I Know I can do an Array.isArray on the nestedKey part, but Im not sure how to make this recursive, as there could be one or more arrays.

paramsForAjaxCall is the object above.

Thoughts?

Upvotes: 2

Views: 2327

Answers (2)

Aziz.G
Aziz.G

Reputation: 3721

you can map the array then take the values from the Object and with every will get a boolean value so it's an array of booleans in the end because we mapping.

if this array contains a false so the result is false

const data = {
  "params": {
    "time_to_diagnosis": [{
        "field": "date_of_diagnosis",
        "value": "ddd"
      },
      {
        "field": "date_of_symptom_onset",
        "value": "2019-09-01"
      }
    ],
    "time_since_onset": [{
      "field": "date_of_symptom_onset",
      "value": "2019-09-01"
    }]
  }
}

const res = !Object.values(data).map(o => Object.values(o).map(value => value.every(({
  value
}) => value !== ""))).flat().includes(false)


console.log(res)

Upvotes: 1

Nina Scholz
Nina Scholz

Reputation: 386680

You could take a check for not object and return false, then check for the wanted property or iterate all properties.

function check(object) {
    if (!object || typeof object !== 'object') return false;
    if (object.value) return true;
    return Object.values(object).every(check);
}

var object = { params: { time_to_diagnosis: [{ field: "date_of_diagnosis", value: "" }, { field: "date_of_symptom_onset", value: "2019-09-01" }], time_since_onset: [{ field: "date_of_symptom_onset", value: "2019-09-01" }] } }

console.log(check(object));

object.params.time_to_diagnosis[0].value= "foo";
console.log(check(object));

Upvotes: 1

Related Questions