У меня есть объект Javascript, как:
var my_object = { a:undefined, b:2, c:4, d:undefined };
Как удалить все неопределенные свойства? Ложные атрибуты должны остаться.
javascript
object
lodash
JLavoie
источник
источник
_.pickBy(obj, _.identity);
false
ВалуВы можете просто цепь
_.omit()
с_.isUndefined
и_.isNull
композицией, и получить результат с ленивой оценкой.демонстрация
Обновление 14 марта 2016 года :
Как упоминалось dylants в разделе комментариев, вы должны использовать
_.omitBy()
функцию, так как она использует предикат вместо свойства. Вы должны использовать это для версии lodash4.0.0
и выше.DEMO
Обновление 1 июня 2016 года :
Как прокомментировал Макс Truxa , lodash уже предоставили альтернативу
_.isNil
, который проверяет , какnull
иundefined
:источник
omitBy
функцию вместоomit
. Итак_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
_.isNil
вместо цепочки_.isUndefined
и_.isNull
. Это делает его еще короче:var result = _.omitBy(my_object, _.isNil);
omitBy
менее производительный чемpickBy
, поэтому последний должен быть предпочтительным, и условие в функции iteratee полностью изменено. Принятый ответ выше получил это право.null
иundefined
значения.identity
Предикат также удалитfalse
значения, так что если вы просто выводили ее на цель , то я не вижу проблемы на вопрос с моим ответом. Кроме того, если мы говорим о «производительности» , то по умолчаниюomitBy
просто звонкиpickBy
с отрицательнымidentity
предикатом. Таким образом, с точки зрения производительности, он слишком мал, чтобы быть значительным.если вы используете lodash, вы можете использовать
_.compact(array)
для удаления всех ложных значений из массива.https://lodash.com/docs/4.17.4#compact
источник
_.pickBy(object, _.isNumber)
в этом случае.Правильный ответ:
Это приводит к:
Альтернатива, данная здесь другими людьми:
Будут удалены также
false
значения, которые здесь не нужны.источник
{"a":1,"b":{"a":1,"b":null,"c":undefined}}
свойство object.bb
, 'c' не будет удаленоПросто:
Вышеприведенное не учитывает
null
значения, так как они отсутствуют в исходном примере и упоминаются только в теме, но я оставляю это как элегантное и может иметь свое применение.Вот полный пример, менее сжатый, но более полный.
источник
_.omitBy
.Чтобы завершить другие ответы, в lodash 4, чтобы игнорировать только undefined и null (а не такие свойства, как
false
), вы можете использовать предикат в_.pickBy
:_.pickBy(obj, v !== null && v !== undefined)
Пример ниже:
источник
0
,''
,false
значение. Также вы можете сократить обратный вызов доv => v != null
.Согласно документам lodash:
Также вы можете отфильтровать все нули
источник
Для глубоко вложенного объекта вы можете использовать мой фрагмент для lodash> 4
источник
Я столкнулся с аналогичной проблемой с удалением
undefined
из объекта (глубоко) и обнаружил, что если вы в порядке, чтобы преобразовать свой старый объект и использовать JSON, быстрая и грязная вспомогательная функция будет выглядеть следующим образом:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description
«... Если не определено, функция или символ встречаются во время преобразования, они либо опускаются (когда он найден в объекте), либо подвергаются цензуре на ноль (когда он находится в массиве)».
источник
с чистым JavaScript: (хотя Object.entries - это ES7, Object.assign - это ES6; но эквивалентный ES5 использует только Object.keys, это также можно сделать); также обратите внимание на
v != null
проверки как нулевых, так и неопределенных;Изменить: ниже приведена версия только с ES5 Object.keys: но в целом с ES7 в Node v8 это очень приятно ;-)
Обновление в октябре 2017 года : с Node v8 (начиная с v8.3 или около того) теперь он имеет конструкцию распространения объекта:
или только в пределах одного снижения:
Обновление: кто-то хочет рекурсивный? это тоже не сложно, просто нужно дополнительно проверить isObject и рекурсивно вызвать себя:
мой вывод: если бы можно было использовать чистый Javascript, я бы избегал любых сторонних библиотечных зависимостей:
источник
Поскольку некоторые из вас, возможно, пришли к вопросу о том, чтобы конкретно удалить только
undefined
, вы можете использовать:комбинация методов Лодаша
rundef
пакет, который удаляет толькоundefined
свойстваЕсли вам нужно рекурсивно удалить
undefined
свойства, вrundef
пакете также естьrecursive
опция.Смотрите документацию для более подробной информации.
источник
Вот какой подход я бы выбрал:
Функция pair () превращает входной объект в массив массивов ключ / значение. Вы делаете это так, чтобы было проще использовать reject () для исключения
undefined
иnull
значений. После этого у вас останутся пары, которые не были отклонены, и это входные данные для zipObject () , который восстанавливает ваш объект за вас.источник
Принимая во внимание, что
undefined == null
мы можем написать следующее:Пример JSBin
источник
pickBy использует идентичность по умолчанию:
источник
Кратчайший путь (lodash v4):
источник
С помощью lodash (или подчеркивания) вы можете сделать
В противном случае, с ванильным JavaScript, вы можете сделать
Не использовать тест Falsey, потому что будет отклонено не только «undefined» или «null» , но и другое значение «falsey», например «false», «0», пустая строка, {}. Таким образом, просто чтобы сделать его простым и понятным, я решил использовать явное сравнение, как написано выше.
источник
Это решение помогает опустить все ложные значения, но оставить логические примитивы.
источник
источник
Я бы использовал подчеркивание и позаботился бы о пустых строках:
jsbin .
источник
Для глубоко вложенных объектов и массивов. и исключить пустые значения из строки и NaN
результат:
источник
Мне нравится использовать _.pickBy, потому что у вас есть полный контроль над тем, что вы удаляете:
Источник: https://www.codegrepper.com/?search_term=lodash+remove+undefined+values+from+object
источник
Для тех из вас, кто хочет удалить массив из объектов и использовать lodash, вы можете сделать что-то вроде этого:
Примечание: вам не нужно разрушать, если вы не хотите.
источник