#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 🙂