stackato
stackato

Reputation: 1145

JavaScript -- find matching object in array of objects

I am trying to search for an object in an array of objects.

Note, vals and recs objects will be DYNAMIC.

var vals = {ID: "4", LOC: "LA", SEQ: "1"};

var recs = [
  {ID:"4", LOC:"LA", SEQ:"1"},
  {ID:"4", LOC:"NY", SEQ:"1"},
  {ID:"4", LOC:"CHI",SEQ:"1"}

];

Now I need to check if all key:value pairs in vals already exist in recs . In this case, recs[0] is an exact match of vals.

Heres my attempt:

var vals =  {ID: "4", LOC: "LA", SEQ: "1"};


var recs = [
  {ID:"4", LOC:"LA", SEQ:"1"},
  {ID:"3", LOC:"NY", SEQ:"2"},
  {ID:"2", LOC:"CHI",SEQ:"3"}

];


for(var i = 0; i<recs.length; i++){  
    if(recs[i]["ID"] == vals["ID"] && recs[i]["LOC"] == vals["LOC"] && recs[i]["SEQ"] == vals["SEQ"]){
      console.log(true);
    }
    else{
      console.log(false);
    }  
}

The above works only because I have hardcoded the keys from the vals object. In reality, the VALS object (and recs) will be DYNAMIC with X number of key:value pairs.

So how can I modify my for loop for a dynamic vals object?

thanks!

Upvotes: 3

Views: 5792

Answers (6)

Jairo Malanay
Jairo Malanay

Reputation: 1347

you can use underscorejs isEqual for this kind of problem

Upvotes: 0

YSharp
YSharp

Reputation: 1086

Try this:

for (var i = 0; i < recs.length; i++) {  
  var found = true;
  for (var p in vals) {
    if (vals.hasOwnProperty(p)) {
      if (recs[i][p] !== vals[p]) {
        found = false;
        break;
      }
    }
  }
  console.log(found);
}

Upvotes: 1

Jonas Meinerz
Jonas Meinerz

Reputation: 622

You need to break it into two loops, one for each object of the array and one for each key of the object:

for(var i = 0; i<recs.length; i++){  
  var found = false
  for(var key in recs[i]) {
    if(recs[i].hasOwnProperty(key)){
      if(recs[i][key] != vals[key]){
        found = true
      }
    }
  console.log(found)
}

the hasOwnProperty call will make sure it doesn't break if the object does not have that key.

Upvotes: 1

blurfus
blurfus

Reputation: 14031

You could iterate over the keys; something along the lines of:

var vals = {  ID: "4",  LOC: "LA",  SEQ: "1", REGION: "USA" };


var recs = [{    ID: 4,    LOC: "LA",    SEQ: "1",    REGION: "USA"  },
            {    ID: 3,    LOC: "NY",    SEQ: "2",    REGION: "USA"  },
            {    ID: 2,    LOC: "CHI",    SEQ: "3",    REGION: "USA" }

];

var isSame = true;

for (var i = 0; i < recs.length; i++) {
  console.log( i + '----------------' );
  var isSame = true;
  
  // get the keys of the record
  var keys = Object.keys(recs[i]);

  for (var j = 0; j < keys.length; j++) {
    
    var key = keys[j];
    var record = recs[i] 
    
    console.log( key + ": " + record[key] + '=' + vals[key] );   
    
    if (record[key] != vals[key] ) {                                
        isSame = false;// not equal
        break;
    }
  }

  console.log('isSame: ' + isSame );
  console.log('------------------' );
}

Upvotes: 1

user4227915
user4227915

Reputation:

You can try this:

function myFind(recs, vals) {
    return recs.some(function(obj) {
        for (var x in obj)
            if (x in vals && obj[x] != vals[x])
                return false;
        return true;
    });
}

var recs = [
    {ID:4, LOC:"LA", SEQ:"1", USA:"USA"},
    {ID:3, LOC:"NY", SEQ:"2", USA:"USA"},
    {ID:2, LOC:"CHI",SEQ:"3", USA:"USA"}
];

var vals =  {ID: "4", LOC: "LA", SEQ: "1"};

if (myFind(recs, vals)) {
    alert('found');
} else {
    alert('not found');
}

Hope it helps.

Upvotes: 0

George Chen
George Chen

Reputation: 6939

for(var i = 0; i<recs.length; i++) {  
    for (var prop in object) {
       if (recs[i][prop] != vals[prop]) {
           console.log(false);
           return;
       }

    }
    //check from both sides
    for (var prop in vals) {
       if (recs[i][prop] != vals[prop]) {
           console.log(false);
           return;
       }

    }
    console.log(true);


}

Upvotes: 1

Related Questions