2016-10-30 3 views
17

Мне нужно удалить нежелательные свойства объекта, которые не соответствуют моей модели. Как я могу достичь этого с помощью lodash.удаление свойств объекта с помощью lodash

Моя модель

var model = { 
    fname:null, 
    lname:null 
} 

Мой выход контроллера перед отправкой на сервер будет

var credentials = { 
    fname:"xyz", 
    lname:"abc", 
    age:23 
} 

, если я использую

_.extend (model, credentials) 

я получаю возрастную собственность тоже. Я знаю, что могу использовать

delete credentials.age 

но что, если у меня есть более 10 нежелательных объектов. Могу ли я достичь этого с помощью lodash.

ответ

18

Получить список свойств от model с помощью _.keys() и использовать _.pick() извлечь свойства из credentials к новому объекту:

var model = { 
 
    fname:null, 
 
    lname:null 
 
}; 
 

 
var credentials = { 
 
    fname:"xyz", 
 
    lname:"abc", 
 
    age:23 
 
}; 
 

 
var result = _.pick(credentials, _.keys(model)); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

Если вы не хотите использовать lodash , вы можете использовать Object.keys() и Array.prototype.reduce():

var model = { 
 
    fname:null, 
 
    lname:null 
 
}; 
 

 
var credentials = { 
 
    fname:"xyz", 
 
    lname:"abc", 
 
    age:23 
 
}; 
 

 
var result = Object.keys(model).reduce(function(obj, key) { 
 
    obj[key] = credentials[key]; 
 
    return obj; 
 
}, {}); 
 

 
console.log(result);

3

Вы можете легко сделать это с помощью _.pick:

var model = { 
 
fname:null, 
 
lname:null 
 
}; 
 

 
var credentials = { 
 
    fname: 'abc', 
 
    lname: 'xyz', 
 
    age: 2 
 
}; 
 

 
var result = _.pick(credentials, _.keys(model)); 
 

 

 
console.log('result =', result);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

Но вы можете просто использовать чистый JavaScript (особенно, если вы используете ES6), как это:

const model = { 
 
    fname: null, 
 
    lname: null 
 
}; 
 

 
const credentials = { 
 
    fname: 'abc', 
 
    lname: 'xyz', 
 
    age: 2 
 
}; 
 

 
const newModel = {}; 
 

 
Object.keys(model).forEach(key => newModel[key] = credentials[key]); 
 

 
console.log('newModel =', newModel);

35

Вы можете подойти к нему с любой белый список или черный список, как:

// Black list 
// Remove the values you don't want 
var result = _.omit(credentials, ['age']); 

// White list 
// Only allow certain values 
var result = _.pick(credentials, ['fname', 'lname']); 

Если это многоразовые бизнес-логики, вы можете парциальное это как хорошо:

// Partial out a black list version 
var clean = _.partial(omit, _, ['age']); 

// and later 
var result = clean(credentials); 
+1

это правильно ответ, поскольку функция, которая удаляет, является '_.omit', в то время как' _.pick' указывает, что вы хотите (что совершенно наоборот) – thiagoh

+0

правильно - и зависит от вашего общего подхода и бизнес-логики - любая версия будет работать в зависимости от вашего требования – Chris

+0

Для частичного вы сделали опечатку, ее '_.partial (_. Omit ...'. –