Удалите пустые свойства / ложные значения из объекта с подчеркиванием.js
У меня есть объект с несколькими свойствами. Я хотел бы удалить любые свойства, которые имеют ложные значения.
Это может быть достигнуто с compact на массивы, но как насчет объектов?
11 ответов:
вы можете сделать свой собственный плагин подчеркивания (mixin):
_.mixin({ compactObject: function(o) { _.each(o, function(v, k) { if(!v) { delete o[k]; } }); return o; } });и затем использовать его в качестве собственного метода подчеркивания :
var o = _.compactObject({ foo: 'bar', a: 0, b: false, c: '', d: null, e: undefined });обновление
как @AndreiNeculauуказал, этот mixin влияет на исходный объект, в то время как оригинал
compactподчеркивания способ возвращает копию массива.
Чтобы решить эту проблему и сделать нашcompactObjectведите себя так, как будто это Кузина, вот небольшое обновление:_.mixin({ compactObject : function(o) { var clone = _.clone(o); _.each(clone, function(v, k) { if(!v) { delete clone[k]; } }); return clone; } });
начиная с подчеркивания версии 1.7.0, вы можете использовать
_.pick:_.pick(sourceObj, _.identity)объяснение
второй параметр
_.pickможет быть функцией предиката для выбора значений. Значения, для которых предикат возвращает истина выбираются значения, для которых предикат возвращает ложь игнорируются.pick_.выберите (объект, * ключи)
вернуть копию объект, фильтруется, чтобы иметь только значения для белого списка ключи (или массив допустимых ключей). Также принимает предикат, указывающий, какие ключи подобрать.
_.identity- это вспомогательная функция, которая возвращает свой первый аргумент, что означает, что она также работает как функция предиката, которая выбирает истинные значения и отвергает ложные. Библиотека подчеркивания также поставляется с кучей других предикатов, например_.pick(sourceObj, _.isBoolean)сохранит только логическое свойства.если вы используете эту технику много, вы можете сделать его немного более выразительным:
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something pickNonfalsy(sourceObj);подчеркивание версии 1.6.0 при условии
_.pickтакже, но он не принимал функцию предиката вместо белого списка.
Quick ' N Clear:
_.omit( source, i => !i );это сказано в обратном порядке к ответу Эмиля. Таким образом, имхо читает яснее; это более понятно.
немного менее чистый, если у вас нет роскоши ES6:
_.omit( source, function(i){return !i;});альтернативный:
_.omit( source, _.isEmpty)используя
_.isEmpty, вместо_.identityдля truthiness, также будет удобно удалять пустые массивы и объекты из коллекции и, возможно, неудобно удалять числа и даты. Таким образом, результат не является точным ответом на вопрос OP, однако это может быть полезно при поиске для удаления пустых коллекций.
С лодашь это transform,
_.transform(obj, function(res, v, k) { if (v) res[k] = v; });
для объекта используйте delete.
for(var k in obj){ if(obj.hasOwnProperty(k) && !obj[k]){ delete obj[k]; } }
внезапно мне понадобилось создать функцию для удаления рекурсивно фальсификаций. Надеюсь, это поможет. Я использую Лодаш.
var removeFalsies = function (obj) { return _.transform(obj, function (o, v, k) { if (v && typeof v === 'object') { o[k] = _.removeFalsies(v); } else if (v) { o[k] = v; } }); }; _.mixin({ 'removeFalsies': removeFalsies });затем вы можете использовать:
var o = _.removeFalsies({ foo: 'bar', a: 0, b: false, c: '', d: null, e: undefined, obj: { foo: 'bar', a: 0, b: false, c: '', d: null, e: undefined } }); // { // foo: 'bar', // obj: { // foo: 'bar' // } // }
чтобы добавить к ответу gion_13:
_.mixin({ compactObject : function(o) { var newObject = {}; _.each(o, function(v, k) { if(v !== null && v !== undefined) { newObject[k] = v } }); return newObject; } });Он создает новый объект и добавляет ключи и значения вместо клонирования всего и удаления пар ключ-значение. Незначительное различие.
но что еще более важно, проверяет явно для null и undefined вместо falsey, который будет удалять пары ключ-значение, которые имеют false в качестве значения.
хотя
_.compactдокументирован для использования в массивах. Это, кажется, работает для объектов тоже. Я просто запустил следующее В Chrome, opera и firefox консолях:var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}} undefined _.compact(obj) [1, 3, function()]обновление: как показывает пример вызова
_.compactна объекте будут отброшены ключи и возвращен уплотненный массив.
Comments