Оценка короткого замыкания JavaScript - отсутствует значение свойства - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь улучшить свои методы кодирования, поэтому я попытался провести рефакторинг следующего кода:

РЕДАКТИРОВАТЬ Мой вопрос - каков наилучший метод оценки короткого замыкания https://codeburst.io/javascript-what-is-short-circuit-evaluation-ff22b2f5608c

var idArray = [
    { id: 15 },
    { id: -1 },
    { id: 0 },
    { id: 3 },
    { },
    { id: null },
    { id: NaN },
    { id: 'undefined' }
  ]

let idFilteredArray0 = []

idArray.forEach(idObj  =>{
if(typeof idObj.id === 'number' && !isNaN(idObj.id))
    idFilteredArray0.push(idObj.id)
})

// from a forEach loop which returns [ 15, -1, 0, 3, 12.2 ]

let idF0 = idArray.reduce((acc, obj) => {
  if((obj.id || obj.id)  && !isNaN(obj.id))
    acc.push(obj.id)
  return acc
},[]) 

// to reduce which returns [15, -1, 3, 12.2]

Я думаю, && 'является проблемой, но я не вижу другого способа исключить значение NaN.На этом этапе я бы согласился вернуть 0 в массив результатов.Наконец, если кто-то знает хороший источник для изучения оценки короткого замыкания, я был бы очень признателен.Спасибо.

J.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете отфильтровать и отобразить элементы и проверить тип и идентификатор, значение которых не равно NaN.

var idArray = [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }, {}, { id: null }, { id: NaN }, { id: 'undefined' }],
    idFiltered = idArray
        .filter(({ id }) => typeof id === 'number' && !isNaN(id))
        .map(({ id }) => id);

console.log(idFiltered);
0 голосов
/ 25 февраля 2019

if(obj.id) вернет false, если obj.id равно 0.Вы должны рефакторинг сделать что-то вроде этого, чтобы учесть ноль:

let idF0 = idArray.reduce((acc, obj) => {
  if(typeof obj.id === 'number'  && !isNaN(obj.id))
    acc.push(obj.id)
  return acc
},[]) 

И если вы хотите добиться еще большей производительности, рассмотрите следующее решение, которое работает с линейной сложностью времени, например .reduce(), нонамного быстрее, чем решение .reduce():

let idF0 = [], i = 0, length = idArray.length, id;

for (; i < length; i++) {
  id = idArray[i].id;
  if (id === 'number' && !isNaN(id)) {
    idF0.push(id);
  }
}

return idF0;
...