Используйте один объект, чтобы уменьшить другой, используя lodash - PullRequest
0 голосов
/ 29 сентября 2019

Мне нужно использовать информацию в одном объекте, чтобы определить, какую информацию в другом включить.Идея состоит в том, что display контролирует то, что должно быть включено, в то время как alarms содержит все тревоги во всех их состояниях.

display={
  0: false,
  1: true,
  2: true,
  3: true,
  ACK: false,
  MASKED: false,
  SHELVED: false,
}

alarms={inAlarm:{ 0:["A"],
                  1:["B"],
                  2:["C"],
                  3:["D"],
                },
        latched:{ 1:[],
                  2:["C"],
                  3:[],
                },
        connectionError:["E"],
        ACK:["F"],
        SHELVED:["G"],
        MASKED:[],
}

Все в защелках должно быть всегда включено, но остальные могут быть включены/ выкл.Поэтому в этом случае я хочу получить один массив, который должен быть: ["B","C","D"].Я ищу аккуратный способ сделать это или даже эффективную и элегантную стандартную версию js - но желательно то, что не требует вспомогательных функций.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Расширение ответа @ Fonty, который не будет работать для клавиш 0, 1, 2, 3 в экранном объекте, потому что для них необходимо выбрать значение клавиши inAlarm:

var result = [];
for (var key in display) {
   if (!display[key]) {
     continue;
   }
   if (isNaN(key)) { // for non-numeric keys
      result = _.union(result, alarms[key]);
   } else { // for numeric keys
      result = _.union(result, alarms.inAlarm[key]);
   }
}
result = _.union(result, _.union(_.flatten(_.values(alarms.latched))));
console.log(result);
0 голосов
/ 29 сентября 2019

Так что, хотя это может быть не самое элегантное решение, и оно не слишком сложное, оно не так уж плохо.Лучшее решение состояло в том, чтобы не включать клавишу inAlarm, а вытащить эти значения на верхний уровень.Тогда я могу просто сделать:

let tempA=[]

for(var key in display){
  if(display[key]){
    tempA=_.union(tempA, alarms[key])
  }
}

tempA=_.union(tempA, _.flatten(_.union(_.values(alarms.LATCHED))))

Это кажется быстрым и не интенсивным, даже если у меня было несколько тысяч записей.

...