Удалить нулевые или неопределенные атрибуты в объекте - PullRequest
2 голосов
/ 04 апреля 2019

Я хочу создать метод для удаления нулевых и неопределенных атрибутов.

Для этого:

Я конвертирую свой простой объект в таблицу

цикл по нему

Фильтр по атрибутам, если есть ноль или неопределено

Но дело в том, что я не прихожу, чтобы реструктурировать свой объект с новыми значениями.Давайте посмотрим:

var req = {
    adtForm1: {
      firstName: 'John',
      lastName: undefined,
      middleName: ''
    },
    adtForm2: {
      firstName: null,
      lastName: 'Doe',
      middleName: ''
    }
  };

  removeUndefinedFormsAttributes = (somesForms) => {
    const forms = Object.values(somesForms);
    const formsUpdate = {};
    forms.forEach(item => {
      const formFields = Object.values(item);
      formFieldsKeys = Object.keys(item);
      const formFiltered = formFields.filter(field => { return field !== null && field !== undefined; });
      console.log("formFiltered", formFiltered);
    })
    console.log(somesForms)
    return forms;
  };

removeUndefinedFormsAttributes(req)

Как видно из фрагмента, formFiltered меняет правильные значения, но мне нужно вернуть тот же объект, что и somesForms.Это то, что мне нужно:

expectedValue = {
    adtForm1: {
        firstName: 'John',
        middleName: ''
    },
    adtForm2: {
        lastName: 'Doe',
        middleName: ''
    }
}

Я знаю, что мне нужно использовать функцию limit () и функцию keys (), но на самом деле я не знаю как.Я буду очень признателен за любую помощь.

Ответы [ 5 ]

3 голосов
/ 04 апреля 2019

Если вам просто нужно удалить ключи со значениями null или undefined из объектов, вложенных на один уровень ниже, то вы можете перебирать значения вашего основного объекта с помощью Object.values, а затем перебирать ключи каждого вложенногоиспользуйте Object.keys и удалите те из них, которые соответствуют вашим условиям.Вы можете проверить значения вложенных объектов, чтобы определить, являются ли они null или undefined с чем-то вроде value == null (см. Как определить, является ли переменная неопределенной или нулевой? ).

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

Например:

var req = {
  adtForm1: {
    firstName: 'John',
    lastName: undefined,
    middleName: ''
  },
  adtForm2: {
    firstName: null,
    lastName: 'Doe',
    middleName: ''
  }
};

Object.values(req).forEach(v => {
  Object.keys(v).forEach(k => {
    if (v[k] == null) {
      delete v[k];
    }
  });
});

console.log(req);
// {"adtForm1":{"firstName":"John","middleName":""},"adtForm2":{"lastName":"Doe","middleName":""}}
2 голосов
/ 04 апреля 2019

Вы можете рекурсивно выполнить итерацию объекта и создать новый объект без null или undefined. Используйте Object.entries(), чтобы получить ключи и пары значений из объекта. Итерируйте пары с Array.reduce. Если значение равно null или undefined, пропустите его ключ. Если это объект, присвойте ключу результат вызова removeUndefinedFormsAttributes для значения. А если это не объект, просто назначьте значение ключу.

const req = {"adtForm1":{"firstName":"John","middleName":""},"adtForm2":{"firstName":null,"lastName":"Doe","middleName":""}};

const removeUndefinedFormsAttributes = (obj) => 
  Object.entries(obj).reduce((r, [k, v]) => {
    if(v === null || v === undefined) return r;
    if(typeof v === 'object') r[k] = removeUndefinedFormsAttributes(v);
    else r[k] = v;
    
    return r;
  }, {});

const result = removeUndefinedFormsAttributes(req)

console.log(result)
1 голос
/ 04 апреля 2019

Если я понимаю, вам нужно изменить реальный объект вместо создания новой структуры. Если это так, то вы не хотите .reduce(). Вам просто нужна рекурсивная функция, которая модифицирует данный объект.

var req = {
  adtForm1: {
    firstName: 'John',
    lastName: undefined,
    middleName: ''
  },
  adtForm2: {
    firstName: null,
    lastName: 'Doe',
    middleName: ''
  }
};

function removeUndefinedFormsAttributes(obj) {
  Object.entries(obj)
    .forEach(([k, v]) => {
      if (v == null) {
        delete obj[k];
      } else if (typeof v === "object") {
        removeUndefinedFormsAttributes(v);
      }
    })
};

removeUndefinedFormsAttributes(req);

console.log(req);

Здесь я использовал Object.entries, чтобы получить пары ключ / значение для данного объекта.

Если v равно null или undefined, то delete будет k от объекта. Если v является объектом, он делает рекурсивный вызов с этим объектом.

К вашему сведению, v == null - это то же самое, что v === null || v === undefined

0 голосов
/ 04 апреля 2019

Вы можете просто клонировать эти атрибуты в новый объект, если они не равны NULL или неопределены.

Довольно простой код, который рекурсивно проходит по obj и вставляет атрибуты только в том случае, если они действительны:

function clearObject(object) {
    if (typeof(object) != "object") return false;

    const clean_object = {};

    for (let k in object) {
        let item = object[k];
        if (item === null || item === undefined) continue;
        clean_object[k] = clearObject(item) || item;
    }

    return clean_object;
}
0 голосов
/ 04 апреля 2019

Попробуйте это

  let removeNotNeedet = ( obj ) => {
    let newObj = {} 
    for (const key in obj) {
        if ( obj[key] !== null && obj[key] !== undefined ){
            newObj[key] = obj[key]
        }
    }
    return newObj
  }
...