Sign up ×
Stack Overflow is a community of 4.7 million programmers, just like you, helping each other. Join them, it only takes a minute:

I'm currently practicing some basic problem in js and fairly new to any of these languages. I want to retrieve the value and name of the property into an array "temp" from the object "second" if the another obj "third" has the same property value. I can do it, when the property name is already defined, but how can I do the same if I don't know the actual property name. May be using Object.keys()

My code is something like this:

      function where(second, third) {
  var arr = [];
  var temp=[];
  for(var i in second)
    {

      if(third.hasOwnProperty('last')){
        if(second[i].last===third.last){
          arr=second[i];
          temp.push(arr);
        }
      }
      if(third.hasOwnProperty('first')){
        if(second[i].first===third.first){
          arr=second[i];
          temp.push(arr);
        }
      }

    }
  return temp;
}

where([{ first: 'Ram', last: 'Ktm' }, { first: 'Sam', last: null }, { first: 'Tybalt', last: 'Capulet' }], { last: 'Capulet' });

The resulting array is : [{ 'first': 'Tybalt', 'last': 'Capulet' }]

How can I retrieve the same result even if I don't know the actual property name. For instance the name here first and last might be food, and uses which is unknown. I've already gone with the following threads here.

[2]: http://stackoverflow.com/questions/4607991/javascript-transform-object-into-array

[1]: http://stackoverflow.com/questions/4607991/javascript-transform-object-into-array

share|improve this question
    
Whats for(var i in collection), where's the collection – fuyushimoya Jun 20 at 8:23
    
@fuyushimoya, just corrected that it meant to be for(var i in second). – user2906838 Jun 20 at 8:29

3 Answers 3

up vote 1 down vote accepted
function where(second, third) {
    var temp = [];
    var k = Object.keys(third)[0]; // expecting only one element!
    second.forEach(function (obj) {
        if (obj[k] === third[k]) {
            temp.push(obj);
        }
    });
    return temp;
}
share|improve this answer
    
thank you! Shouldn't the obj be defined anywhere? – user2906838 Jun 20 at 8:59
    
obj is a parameter of the callback function. – Nina Scholz Jun 20 at 9:01
function where(second, third) {
  var tmp = [];
  var length = second.length;

  var i, k, test;
  // Go through second's each item to see that...
  for (i = 0; i < length; ++i) {
    test = second[i];
    // For all key in third that belongs to third (not inherited or else)
    for (k in third) {
      // Check has own property.
      if (!third.hasOwnProperty(k)) {
        continue;
      }
      // If second[i] don't have key `k` in second or second[i][k]'s value is 
      // not equal to third[k], then don't put it into tmp, start to check next.
      if (!third.hasOwnProperty(k)) {
        break;
      } else if (test[k] !== third[k]) {
        break;
      }
      tmp.push(test);
    }
  }
  return tmp;
}
share|improve this answer
    
@fuyshimoya , thank you! I couldn't even vote up. You perfectly filtered the value of the "third". – user2906838 Jun 20 at 8:36
    
I edited, for you use the hasOwnProperty, which you may concern if your object is extended or created by some extended prototypes. – fuyushimoya Jun 20 at 8:38
    
What would be the approach, If I wish to use Object.keys(). Assume I'm very newbie. – user2906838 Jun 20 at 8:41
    
@user2906838, see my answer. – Nina Scholz Jun 20 at 8:42
    
@NinaScholz, thank you so much – user2906838 Jun 20 at 8:57

I think the getOwnPropertyName is what you're looking for. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

Object.getOwnPropertyNames({a:1,2:"b",c:"a"}).sort() // returns Array [ "2", "a", "c" ]

I'll expand on my initial answer

var temp = [];

var myobj = [{cat:"Felix",dog:"Milo",bird:"Monkey",3:"pets"}, 
         {cat:"Wiskers",dog:"yapper",bird:"tweeter",1:"human"}];

var myobj2 = {cat:"Harry",dog:"Fuzz",1:"human"};

var objKeys = Object.getOwnPropertyNames(myobj); //will have key "1" that matches below

objKeys.forEach(function(key) {
    if(myobj2.hasOwnProperty(key)) {
        temp.push(myobj2[key]) // will push "human" to temp array
    }
})
share|improve this answer
    
that's looks pretty and short but I'm not sure, will try to use this. – user2906838 Jun 20 at 8:58
    
whoops. I actually forgot something. Helping people at 5am may not be a good thing.. Need to loop myobj to get each object's keys :< – Knight Yoshi Jun 20 at 9:10
    
I think Nina Scholz's answer is probably the best. – Knight Yoshi Jun 20 at 9:11
    
Thanks! I must appreciate your support and I do. – user2906838 Jun 20 at 9:31

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.