Как получить совпадающие значения из словарного объекта в Typescript? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть объект словаря, который заполняется следующим образом:

const myDictionaryElement = this.myDictionary["abc"];

Здесь myDictionaryElement имеет значения:

ACheckStatus: "PASS"
QVVStatus: "READY"
VVQStatus: "READY"
QTTStatus: "READY"
QBCTTStatus: "READY"
CStatus: "FAIL"

Я хочу создать объект таким образом, чтобы все key-value пары, для которых ключ имеет соответствие VV в середине, должны храниться в объекте valuesVV следующим образом:

const valuesVV = { QVVStatus: "READY" };

Аналогично всем key-value парам, для которых ключ имеет соответствие TT в середине должен храниться в объекте valuesTT следующим образом:

const valuesTT = { QTTStatus: "READY", QBCTTStatus: "READY" } ;

И все пары key-value, для которых ключ не имеет соответствия VV и TT в середине, должны храниться в объекте valuesOther следующим образом:

const valuesOther = { ACheckStatus: "PASS", VVQStatus: "READY", CStatus: "FAIL"  } ;

Для получения вывода о программе я использую hasOwnProperty для словаря, но он не работает

const valuesVV = myDictionaryElement.hasOwnProperty('*VV*');  // It is returning boolean false. The desired output is { QVVStatus: "READY" } 

Ответы [ 3 ]

1 голос
/ 28 апреля 2020

Вы можете обобщить его, создав функцию, которая принимает dict и массив совпадений, как показано ниже:

const dict = {
  ACheckStatus: "PASS",
  QVVStatus: "READY",
  VVQStatus: "READY",
  QTTStatus: "READY",
  QBCTTStatus: "READY",
  CStatus: "FAIL"
};

const matching = ['VV', 'TT', 'SS'];

function matchInput(input, matches) {
  // will have matched object in the index of the match and those without a match 
  // at the end
  const res = [];

  Object.keys(input).forEach(key => {
    // flag if the key wasn't matched to add it to no matches object
    let matched = false;

    matches.forEach((match, i) => {
      if (key.indexOf(match) > 0) {
        matched = true;
        if (!res[i]) res[i] = {};
        res[i][key] = input[key];
      }
    });

    if (!matched) {
      if (!res[matches.length]) res[matches.length] = {};
      res[matches.length][key] = input[key];
    }
  });

  return res;
}

Идея состоит в том, чтобы go над каждым ключом вставить его в нужное ведро ( объект)

1 голос
/ 28 апреля 2020

Вы должны отфильтровать ключи объекта и выбрать только те, которые вам нужны, а затем использовать Reduce для создания нового объекта:

 const vvItems = Object.keys(dictElement)
  .filter(key => key.indexOf('VV')>= 1)
  .reduce((o, key) => { o[key] = dictElement[key]; return o; }, {})
0 голосов
/ 29 апреля 2020

Вы можете использовать Object.keys для перечисления свойств объекта. Затем l oop через ваши ключевые слова, проверьте их с помощью property.indexOf(key) > -1, если найдено, затем добавьте его в словарь с помощью ключа, иначе добавьте его с помощью ключа "rest". У вас будет конечный объект, который будет выглядеть так:

{
  "Key1":{
          "matchedKey11":"some value",
          "matchedKey12":"some other value"
   },
  "Key2":{
          "matchedKey21":"some value",
          "matchedKey22":"some other value"
   },
.....
 "rest": {
          "unmatchedKey":"some value",
    ......
 }
}

const source = {
  ACheckStatus: "PASS",
  QVVStatus: "READY",
  VVQStatus: "READY",
  QTTStatus: "READY",
  QBCTTStatus: "READY",
  CStatus: "FAIL"
};

const search = ['VV', 'TT', 'SS'];

function searchIn(source, keys) {
  const result = {
    "rest": {}
  }
  Object.keys(source).forEach(o => {
    const found = keys.filter(k => o.indexOf(k) > -1)
    if (found.length > 0)
      found.forEach(k => {
        if (!result[k]) result[k] = {}
        result[k][o] = source[o]
      })
    else
      result["rest"][o] = source[o]
  })
  return result
}

const result = searchIn(source, search);
console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...