Удалите пустые свойства / ложные значения из объекта с подчеркиванием.js



У меня есть объект с несколькими свойствами. Я хотел бы удалить любые свойства, которые имеют ложные значения.



Это может быть достигнуто с compact на массивы, но как насчет объектов?

711   11  

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;
});
Object.keys(o).forEach(function(k) {
    if (!o[k]) {
        delete o[k];
    }
});

вы можете создать мелкий клон:

_(obj).reduce(function(a,v,k){ 
     if(v){ a[k]=v; } 
     return a; 
},{});

для объекта используйте 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 в качестве значения.

в лодашь ты такой:

_.pickBy(object, _.identity);

хотя _.compact документирован для использования в массивах. Это, кажется, работает для объектов тоже. Я просто запустил следующее В Chrome, opera и firefox консолях:

var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}}
undefined
_.compact(obj)

[1, 3, function()]

обновление: как показывает пример вызова _.compact на объекте будут отброшены ключи и возвращен уплотненный массив.

Comments

    Ничего не найдено.