2016-11-09 2 views
1

У меня есть объект:Выберите значение заданных свойств из объекта в массив

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

У меня есть массив имен ключей в заданном порядке:

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

Я хочу, чтобы получить этот массив:

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

Важно, что ответ должен гарантировать заказ (JavaScript не гарантирует порядок для итерации объекта).

Я думаю, что в lodash/underscore, возможно, есть какая-то полезная функция, но ничего не могу понять.

ответ

4

Для этого можно использовать Array.prototype.map. Map пересекает массив и создает новый массив, применяя функцию к каждому элементу. Когда вы используете массив keys в качестве начальной точки и возвращаете значение в o для этого ключа, вы получите новый массив с только значениями.

При использовании «динамических» имен ключей для извлечения значения используется нотация object[stringKeyName].

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);

Если это соответствует вашему стилю, вы можете создать вспомогательный метод для замены анонимной функции:

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);

+0

Мы могли бы даже упростить это в результате вар '= keys.map (к => о [к])', но я до сих пор не нравится. –

+0

Если это вопрос стиля, вы можете обернуть кое-что в помощнике. Посмотрите на второй фрагмент. – user3297291

+0

Если порядок имеет значение, это или функция '_.map' - это путь. –

3

С Lodash вы можете использовать pick и 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>

+0

nice one ...... – Mahi

+0

Гарантирует заказ? –

+0

@ Майкл Батчер: Я не уверен в этом. –