Ian Barber
Ian Barber

Reputation: 173

Loop through arrayObjects with condition Javascript

I found a nice example on here showing how to look through arrayObjects with a condition but I have a question.

As is stands its console.logging every time it the condition is false. Is it possible to only console.log once when its finished looping through everything.

var arrayObjects = [{
    "building": "A",
    "status": "good"
  },
  {
    "building": "B",
    "status": "horrible"
  }
];

for (var i = 0; i < arrayObjects.length; i++) {
  console.log(arrayObjects[i]);

  for (key in arrayObjects[i]) {

    if (key == "status" && arrayObjects[i][key] == "good") {

      console.log(key + "->" + arrayObjects[i][key]);
    } else {
      console.log("nothing found");
    }
  }
}

Upvotes: 1

Views: 90

Answers (5)

A1exandr Belan
A1exandr Belan

Reputation: 4780

Another declarative way solution:

const arrayObjects = [
  { "building": "A", "status": "good" },
  { "building": "B", "status": "horrible" },
];

const checkCondition = (arr, key = 'status', value ='good') => {
  const result = arr.find((obj) => obj[key] === value);
  return result 
    ? `${key} -> ${result[key]}` 
    : "nothing found";
};

console.log(checkCondition(arrayObjects));                  //status -> good
console.log(checkCondition(arrayObjects, 'building', 'B')); //building -> B
console.log(checkCondition(arrayObjects, 'building', 'C')); //nothing found

Upvotes: 0

PsiKai
PsiKai

Reputation: 1978

If you're willing to refactor you code, you can save on time complexity by using just one loop with Array.reduce()

var arrayObjects = [{
    "building": "A",
    "status": "good"
  },
  {
    "building": "B",
    "status": "horrible"
  }
];
const foundKeys = arrayObjects.reduce((bool, key) => {
    console.log(key)
    if (key.status === "good") {
      console.log("status ->", key.status);
      bool = true
    }
    return bool 
}, false)

if (!foundKeys) {
    console.log("Nothing found")
}

Upvotes: 1

Steven Spungin
Steven Spungin

Reputation: 29139

You can use the some or filter method of array.

var arrayObjects = [{"building":"A", "status":"good"}, 
{"building":"B","status":"horrible"}];

const found = arrayObjects.some(it => it.status === 'good')
if (found) {
  console.log('found')
}

const items = arrayObjects.filter(it => it.status === 'good')
if (items.length) {
  console.log('found')
}
 

Upvotes: 1

GMKHussain
GMKHussain

Reputation: 4691

Simply use .length with if condition.

var arrayObjects = [{
    "building": "A",
    "status": "good"
  },
  {
    "building": "B",
    "status": "horrible"
  }
];

for (var i = 0; i < arrayObjects.length; i++) {
  console.log(arrayObjects[i]);

  if( i === arrayObjects.length-1 ) {
      console.log("nothing found");
  }
}

Upvotes: 1

Burakhan Aksoy
Burakhan Aksoy

Reputation: 323

I'm assuming that you want it to print Nothing found when nothing's really found, not even a single thing..

Then, you can try this.


var arrayObjects = [{"building":"A", "status":"good"}, 
{"building":"B","status":"horrible"}];

var isFound = false;

 for (var i=0; i< arrayObjects.length; i++) {
  console.log(arrayObjects[i]);

   for(key in arrayObjects[i]) {

  if (key == "status" && arrayObjects[i][key] == "good") {
      isFound = true
      console.log(key + "->" + arrayObjects[i][key]);
  }
 }
}

if (isFound === false){
      console.log("nothing found");
  }

Upvotes: 1

Related Questions