1

I have an object:

person = { 
    birth_year: 1970, 
    first_name: "John", 
    last_name: "Doe", 
    occupation: "Doctor", 
    city: "Boston",
    married: true 
}

I have an array of key names in given order:

keys = ["occupation", "last_name", "city"]

I want to get this array:

["Doctor", "Doe", "Boston"]

It is important, that the answer should guarantee the order (JavaScript does not guarantee the order for object iteration).

I think there is probably some utility function in lodash/underscore to do it simply, but can't figure out any.

Emile Bergeron
  • 17,074
  • 5
  • 83
  • 129
Mikhail Batcer
  • 1,938
  • 7
  • 37
  • 57

3 Answers3

5

With Lodash you could use pick and values

var o = {
  birth_year: 1970,
  first_name: "John",
  last_name: "Doe",
  occupation: "Doctor",
  city: "Boston",
  married: true
}
var keys = ["occupation", "last_name", "city"];

var result = _.values(_.pick(o, keys));
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
Nenad Vracar
  • 118,580
  • 15
  • 151
  • 176
4

You can use Array.prototype.map for this. Map loops through an array and creates a new array by applying a function to each item. When you use the keys array as a starting point, and return the value in o for that key, you'll get a new array with only values.

When using "dynamic" key names, you use a object[stringKeyName] notation to retrieve a value.

var o = { 
    birth_year: 1970, 
    first_name: "John", 
    last_name: "Doe", 
    occupation: "Doctor", 
    city: "Boston",
    married: true 
};

var keys = ["occupation", "last_name", "city"];

var result = keys.map(function(k) { return o[k]; });

console.log(result);

If it fits your style, you can create a helper method to replace the anonymous function:

var o = { birth_year: 1970, first_name: "John", last_name: "Doe", occupation: "Doctor", city: "Boston", married: true };
var keys = ["occupation", "last_name", "city"];

var prop = obj => key => obj[key];
var result = keys.map(prop(o));

console.log(result);
user3297291
  • 22,592
  • 4
  • 29
  • 45
0

For those who stumble on this answer years later. You can use lodash at method

// I have an object:
const person = { 
    birth_year: 1970, 
    first_name: "John", 
    last_name: "Doe", 
    occupation: "Doctor", 
    city: "Boston",
    married: true 
}

// I have an array of key names in given order:
const keys = ["occupation", "last_name", "city"]

// I want to get this array:
// ["Doctor", "Doe", "Boston"]
const result = at(person, ["occupation", "last_name", "city"])