Удаление свойств объекта с помощью lodash
Мне нужно удалить нежелательные свойства объекта, которые не соответствуют моей модели. Как я могу достичь этого с помощью lodash.
Моя модель
var model = {
fname:null,
lname:null
}
Мой вывод контроллера перед отправкой на сервер будет
var credentials = {
fname:"xyz",
lname:"abc",
age:23
}
если я использую
_.extend (model, credentials)
Я тоже получаю возрастную собственность. Я знаю, что могу использовать
delete credentials.age
но что, если у меня есть более 10 нежелательных объектов. Могу ли я достичь этого с помощью lodash.
Ответы
Ответ 1
Получить список свойств из 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>
Ответ 2
Вы можете подойти к нему из белого или черного списка:
// 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);
Редактировать - согласно комментариям, Lodash5 откажется от поддержки опустить
Подобный подход может быть достигнут без Lodash:
const transform = (obj, predicate) => {
return Object.keys(obj).reduce((memo, key) => {
if(predicate(obj[key], key)) {
memo[key] = obj[key]
}
return memo
}, {})
}
const omit = (obj, items) => transform(obj, (value, key) => !items.includes(key))
const pick = (obj, items) => transform(obj, (value, key) => items.includes(key))
// Partials
// Lazy clean
const cleanL = (obj) => omit(obj, ['age'])
// Guarded clean
const cleanG = (obj) => pick(obj, ['fname', 'lname'])
// "App"
const credentials = {
fname:"xyz",
lname:"abc",
age:23
}
const omitted = omit(credentials, ['age'])
const picked = pick(credentials, ['age'])
const cleanedL = cleanL(credentials)
const cleanedG = cleanG(credentials)
Ответ 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>
Ответ 4
Здесь я использовал omit для соответствующего "ключа", который вы хотите удалить.. используя библиотеку lodash:
var credentials = [{
fname:"xyz",
lname:"abc",
age:23
}]
let result = _.map(credentials, object => {
return _.omit(object, ['fname', 'lname'])
})
console.log('result', result)
Ответ 5
Чтобы выбрать (или удалить) свойства объекта, которые удовлетворяют заданному условию глубоко, вы можете использовать что-то вроде этого:
function pickByDeep(object, condition, arraysToo=false) {
return _.transform(object, (acc, val, key) => {
if (_.isPlainObject(val) || arraysToo && _.isArray(val)) {
acc[key] = pickByDeep(val, condition, arraysToo);
} else if (condition(val, key, object)) {
acc[key] = val;
}
});
}
https://codepen.io/aercolino/pen/MWgjyjm
Ответ 6
Это мое решение для глубокого удаления пустых свойств с помощью lodash:
const compactDeep = obj => {
const emptyFields = [];
function calculateEmpty(prefix, source) {
_.each(source, (val, key) => {
if (_.isObject(val) && !_.isEmpty(val)) {
calculateEmpty('${prefix}${key}.', val);
} else if ((!_.isBoolean(val) && !_.isNumber(val) && !val) || (_.isObject(val) && _.isEmpty(val))) {
emptyFields.push('${prefix}${key}');
}
});
}
calculateEmpty('', obj);
return _.omit(obj, emptyFields);
};