Фильтрация свойств объекта по значению

есть ли какой-то элегантный способ фильтрации свойств falsey из этого объекта с помощью lodash/underscore? Похожие на how _.compact(array) удаляет элементы falsey из массивов

поэтому с

{
  propA: true,
  propB: true,
  propC: false,
  propD: true,
}

возвращение

{
  propA: true,
  propB: true,
  propD: true,
}

4 ответов


до Lodash 4.0

вы хотите _.pick, Она принимает функцию в качестве аргумента и возвращает объект, содержащий только ключи, для которых эта функция возвращает истина. Так что вы можете сделать:

filtered = _.pick(obj, function(value, key) {return value;})

или еще короче:

filtered = _.pick(obj, _.identity)

Лодашь 4.0

Lodash 4.0 разделить


вот два варианта javascript ванили:

А.: перебирать ключи объекта и delete имеющие значение falsey.

var obj = {
  propA: true,
  propB: true,
  propC: false,
  propD: true,
};

Object.keys(obj).forEach(function(key) {
  if (!obj[key]) delete obj[key];
});

console.log(obj);

посмотреть Object.keys() и Array.prototype.forEach()

Б.: выполните итерацию по ключам объекта и добавьте истинные значения к новому объекту.

var obj = {
  propA: true,
  propB: true,
  propC: false,
  propD: true,
};

var filteredObj = Object.keys(obj).reduce(function(p, c) {    
  if (obj[c]) p[c] = obj[c];
  return p;
}, {});

console.log(filteredObj);

посмотреть Object.keys() и Array.prototype.reduce()


Если вы используете lodash, я бы рекомендовал что-то вроде этого:

var object = {
    propA: true,
    propB: true,
    propC: false,
    propD: true,
};

_.pick(object, _.identity);
// →
// {
//   propA: true,
//   propB: true,
//   propD: true
// }

на pick () функция генерирует новый объект, который включает свойства, возвращаемые обратным вызовом истина for. Поэтому мы можем просто использовать identity () функция в качестве обратного вызова, так как она просто вернет каждое значение свойства.


к сожалению, я не могу прокомментировать сообщения выше, поэтому я создаю этот дополнительный пост.

С Lodash v4 функциональность, описанная выше, была перемещена в _.pickBy. С _.identity по умолчанию вы также можете изменить свой код:

var filtered = _.pickBy(obj);

посмотреть этот JSBin рабочий пример.