упростить нечитаемое вложенное if / else

#javascript #ecmascript-6 #nested

#javascript #ecmascript-6 #вложенный

Вопрос:

Мне нужно определить статус родительского объекта на основе 2 переменных каждого из его дочерних элементов. Я придумал рабочее решение, но оно включает вложенный «if-else if-else». Излишне говорить, что это выглядит не очень элегантно.

Мне было интересно, есть ли способ упростить это. Я повозился с некоторым кодом map / reduce, но не добрался ни до чего более элегантного, чем приведенный ниже код.

 const parent = {
  children: [{
      connected: true,
      online: true

    },
    {
      connected: true,
      online: true
    }
  ]
}


// all online amp; all connected  => connected
// all online amp; some connected => partially disconnected
// all online amp; none connected => disconnected
// some online => partially offline
// none online => offline

const onlineArr = parent.children.map(c => c.online);
const connectedArr = parent.children.map(c => c.connected);
let status;

if (!onlineArr.includes(true)) {
  status = 'Offline';
} else if (!onlineArr.includes(false)) {
  if (!connectedArr.includes(true)) {
    status = 'Disconnected';
  } else if (!connectedArr.includes(false)) {
    status = 'Connected';
  } else {
    status = 'Partially disconnected';
  }
} else {
  status = 'Partially offline';
}

console.log(status);  

Комментарии:

1. Это могло бы хорошо подойти для codereview.stackexchange.com

2. @pitto, забыл, что они вообще существуют. спасибо!

Ответ №1:

Я бы просто извлек проверку all / some / none в функцию:

   const overAll = (array, key, value, /*results in */ all, some, none) =>
    array.every(it => it[key] === value) ? all : (array.some(it => it[key] === value) ? some : none);
  

Тогда это так же просто, как:

  const status = (
   overAll(parent.children, "online", true, undefined, "Partially offline", "Offline") ||
   overAll(parent.children, "connected", true, "Connected", "Partially connected", "not connected")
);
  

Но ваш if / else уже довольно чистый, IMO 🙂