2016-10-28 2 views
1

У меня есть две переменные, одна является объектом данных POST (две галочки, а вход по электронной почте):фильтров на основе массива объектов

{ _csrf: 'oWNyWOhgvRyEGafTTOO1Yiv78BfG0D1n+DLVA=', 
    activated: 'true', 
    notify: 'true', 
    email: '[email protected]' } 

Другой, является шаблон файла конфигурации, который используется для генерации формы (где данные POST происходит от):

[{ displayName: 'Activated', 
    name: 'activated', 
    description: '', 
    type: 'Boolean', 
    defaults: { value: false, readOnly: false } } 
{ displayName: 'Send Notifications', 
    name: 'notify', 
    description: '', 
    type: 'Boolean', 
    defaults: { value: false, readOnly: false } } 
{ displayName: 'Notification Email', 
    name: 'email', 
    description: '', 
    type: 'String:Email', 
    defaults: { value: '', readOnly: false } }] 

мне нужно фильтровать первый объект вниз к key: value пару, где ключ присутствует в массиве (name: 'key').

Я пытаюсь использовать _.filter и _.find, однако, что я написал до сих пор успешно фильтрует объект, а только возвращает массив значений, без ключей:

const update = _.filter(req.body, function(val, name){ 
    return _.find(_module.config, function(param){ 
    return param.name == name; 
    }); 
}); 

// update = [ 'true', 'true', '[email protected]' ] 

Наконец, мой последний вопрос заключается в том, что если один из флажков не установлен, в данных POST нет значения для этого ключа. В идеале, функция фильтра также должна устанавливать любые значения, которые она находит в шаблоне конфигурации, но не в данных до false.

ответ

1

.reduce() массив и взять из исходного объекта только свойства, которые соответствуют имена предметов:

function filterPropsByArray(arr, obj) { 
 
    return arr.reduce(function(o, item) { 
 
    obj.hasOwnProperty(item.name) && (o[item.name] = obj[item.name]); // if the name exists in the original object, assign it 
 
    return o; 
 
    }, {}); 
 
} 
 

 
var obj = { _csrf: 'oWNyWOhgvRyEGafTTOO1Yiv78BfG0D1n+DLVA=', 
 
    activated: 'true', 
 
    notify: 'true', 
 
    email: '[email protected]' }; 
 

 
var arr = [{ displayName: 'Activated', 
 
    name: 'activated', 
 
    description: '', 
 
    type: 'Boolean', 
 
    defaults: { value: false, readOnly: false } }, 
 
{ displayName: 'Send Notifications', 
 
    name: 'notify', 
 
    description: '', 
 
    type: 'Boolean', 
 
    defaults: { value: false, readOnly: false } }, 
 
{ displayName: 'Notification Email', 
 
    name: 'email', 
 
    description: '', 
 
    type: 'String:Email', 
 
    defaults: { value: '', readOnly: false } }]; 
 

 
var result = filterPropsByArray(arr, obj); 
 

 
console.log(result);

Смежные вопросы