Удалить пустые объекты, массивы, строки или целые числа из объекта - PullRequest
0 голосов
/ 03 октября 2019

У меня есть следующий фрагмент кода, который не работает, и я решил выделить его в сценарий nodejs:

const _ = require('lodash');

let derpObject = {
    foo: "hey",
    bar: "",
    foo2: [],
    bar2: {}
}

function cleanObject(params) {
    const newObject = Object.keys(params).forEach( key => {
    console.log(params[key]);
        if(_.isNil(params[key]) || _.isEmpty(params[key])) {
      delete params[key]
    }
    });
  console.log('here', newObject);
  return newObject;
}

let result = cleanObject(derpObject);
console.log(result);

В основном моя цель - проверить, какие свойства являются пустыми или нулевыми у основного объекта, и удалитьони и в конце возвращают новый объект только с непустыми / нулевыми свойствами.

Однако, запустив вышеприведенные сценарии, выводим:

hey

[]
{}
here undefined
undefined
=> undefined

Есть идеи, почему я получаю undefined? Я бился головой с этим уже некоторое время

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

.forEach() ничего не возвращает, следовательно, вывод undefined, вы можете попробовать присвоить значения новому объекту и избежать изменения исходного объекта:

function cleanObject(params) {
  const newObject = {};
  Object.keys(params).forEach(key => {
    //console.log(params[key]);
    if (!(_.isNil(params[key]) || _.isEmpty(params[key]))) {
        newObject[key] = params[key]
    }
  });
  //console.log('here', newObject);
  return newObject;
}

let derpObject = {
  foo: "hey",
  bar: "",
  foo2: [],
  bar2: {}
}

function cleanObject(params) {
  const newObject = {};
  Object.keys(params).forEach(key => {
    //console.log(params[key]);
    if (!(_.isNil(params[key]) || _.isEmpty(params[key]))) {
        newObject[key] = params[key]
    }
  });
  //console.log('here', newObject);
  return newObject;
}

let result = cleanObject(derpObject);
console.log(result);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

Чистый Лодаш:

function cleanObject(params) {
  return _(params).omitBy(_.isNil).omitBy(_.isEmpty);
}

let derpObject = {
  foo: "hey",
  bar: "",
  foo2: [],
  bar2: {}
}

function cleanObject(params) {
  return _(params).omitBy(_.isNil).omitBy(_.isEmpty);
}

console.log(cleanObject(derpObject));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
0 голосов
/ 03 октября 2019

Вы можете использовать Array.prototype.reduce () в сочетании с Lodash # isNil () и Lodash # isEmpty ()

Код:

const derpObject = {
  foo: "hey",
  bar: "",
  foo2: [],
  bar2: {}
}
const cleanObject = (o) => Object
  .keys(o)
  .reduce((a, k) => {
    if (!(_.isNil(o[k]) || _.isEmpty(o[k]))) {
      a[k] = o[k]
    }
    return a
  },{})
const result = cleanObject(derpObject)

console.log(result)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
0 голосов
/ 03 октября 2019

Я думаю, ты почти у цели. Я немного изменил логику, чтобы она добавляла ключ объекта и значение, если значение является действительным (не равно нулю или не пусто)

function cleanObject(params) {
    let newObject = {};
    Object.keys(params).forEach( key => {
        console.log(params[key]);
        if(!_.isNil(params[key]) || !_.isEmpty(params[key])) {
            newObject[key] = params[key]
        }
    });
  console.log('here', newObject);
  return newObject;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...