упростить нечитаемую вложенность, если / еще - PullRequest
0 голосов
/ 22 марта 2019

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

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

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

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


// all online & all connected  => connected
// all online & some connected => partially disconnected
// all online & 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 Ответ

0 голосов
/ 22 марта 2019

Я бы просто извлек чек 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уже совсем чистое ИМО:)

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