Каков наилучший способ заменить неопределенный с 0 внутри объекта? - PullRequest
0 голосов
/ 20 мая 2019

вот пример объекта:

значения внутри объекта, которые на самом деле не называются value1, value2 и т. Д.

все они имеют разные имена

data isданные, полученные из API.

let object = {
  id: '1',
  gen: {
    value1: data.value1, 
    value2: data.value2,
    value3: data.value3,
    value4: data.value4, // etc 
  },
  somethingelse: {
    one: {
      value1: data.value1,
      value2: data.value2,
      value3: data.value3,
      value4: data.value4, // etc 
    },
    two: {
      value1: data.value1,
      value2: data.value2,
      value3: data.value3,
      value4: data.value4, // etc 
    },
    three: {
      value1: data.value1,
      value2: data.value2,
      value3: data.value3,
      value4: data.value4, // etc 
    }
  }
};

Я знаю, что могу добавить || 0 к каждому, но это будет много уродливого кода, а также иногда есть математическая операция, которая возвращает NaN, и я могу 'просто сделайте: if (!object.value1) object.value1 = 0, потому что для этого мне понадобится 100 строк дублированного кода

Ответы [ 3 ]

0 голосов
/ 20 мая 2019

Вы можете использовать рекурсию для замены undefined на 0, используя рекурсию.

const data ={}
let object = { id: '1', gen: { value1: data.value1, value2: data.value2, value3: data.value3, value4: data.value4,}, somethingelse: { one: { value1: data.value1, value2: data.value2, value3: data.value3, value4: data.value4, }, two: { value1: data.value1, value2: data.value2, value3: data.value3, value4: data.value4, }, three: { value1: data.value1, value2: data.value2, value3: data.value3, value4: data.value4, } } };
function removeUnf(obj){
  for(let key in obj){
    if(obj[key] && typeof obj[key] === "object"){
      removeUnf(obj[key])
    }
    else obj[key] = obj[key] === undefined ? 0 : obj[key]
  }
}

removeUnf(object);
console.log(object)
0 голосов
/ 20 мая 2019

Если вы можете использовать ES6, вы можете обернуть ваши данные в прокси , который будет возвращать 0 вместо неопределенного.Затем используйте это, чтобы сделать ваш объект:

let real_data = {value1: 10, value2: 2}

// proxy for real data
let data = new Proxy(real_data, {
  get(target, name, receiver) {
      let val = Reflect.get(target, name, receiver);
      return val === undefined ? 0 : val
    }
});

// just use data now

let object = {id: '1',gen: {value1: data.value1, value2: data.value2,value3: data.value3,value4: data.value4, },somethingelse: {one: {value1: data.value1,value2: data.value2,value3: data.value3,value4: data.value4, },two: {value1: data.value1,value2: data.value2,value3: data.value3,value4: data.value4, },three: {value1: data.value1,value2: data.value2,value3: data.value3,value4: data.value4, }}};

console.log(object)
0 голосов
/ 20 мая 2019

Вы можете применить ту же логику к более глубоким объектам с большим количеством циклов:

for(let key in myObject) {
   if(myObject[key] === undefined || myObject[key] === null)
       myObject[key] = 0;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...