создание и подсчет динамических объектов в typescript

#javascript #typescript

Вопрос:

Я пытаюсь вычислить результат из массива для объектов, который я могу посчитать, сколько значений для каждого ключа, и добавить свое собственное dbId к тому же вычисленному результату в имени объекта! причина этого в том, чтобы использовать его для chart.js. таким образом, я могу проверить, что каждое значение результата поставляется со своим собственным dbIds

 const obj = [
  {
    dbId: 26598,
    properties: [
      { attributeName: "BIM7AATypeCode" },
      { displayCategory: "Identity Data" },
      { displayName: "BIM7AATypeCode" },
      { displayValue: "221" },
    ],
  },
  {
    dbId: 26591,
    properties: [
      { attributeName: "BIM7AATypeCode" },
      { displayCategory: "Identity Data" },
      { displayName: "BIM7AATypeCode" },
      { displayValue: "221" },
    ],
  },
  {
    dbId: 3695,
    properties: [
      { attributeName: "abc" },
      { displayCategory: "Identity Data" },
      { displayName: "BIM7AATypeCode" },
      { displayValue: "123" },
    ],
  },
  {
    dbId: 3697,
    properties: [
      { attributeName: "abc" },
      { displayCategory: "Identity Data" },
      { displayName: "BIM7AATypeCode" },
      { displayValue: "123" },
    ],
  },
];

// type Histogram = {
//   [key: string]: number;
// };

let histogram = {}; //as Histogram

for (let iterator of obj) {
  for (let { displayName, displayValue } of iterator.properties) {
    //@ts-ignore
    histogram[displayName] = histogram[displayName] | {};

    if (!histogram[displayValue]) {
      histogram[displayValue] = 1;
    } else {
      histogram[displayValue] = histogram[displayValue]   1;
    }
  }
}

console.log(histogram);

//expected result:

/*

{
  BIM7AATypeCode: {
    "221": 2,
    dbid: [26598, 26591],
  },
  abc: {
    "123": 2,
    dbid: [3695, 3697],
  },
};
*/ 

Ответ №1:

Пожалуйста, найдите Array.reduce реализацию.

Логические

  • Цикл по obj массиву с использованием Array.reduce
  • Из каждого объекта в массиве выберите properties ключ. Из этого выберите узел, имеющий ключ attributeName , который является узлом атрибута и с displayValue помощью которого отображается значение узла.
  • Проверьте, есть ли у аккумулятора узел с attributeName .
  • Если нет, переместите узел в накопитель, displayValue имея значение 1 и dbid в виде одного массива с узлами.
  • Если у аккумулятора уже есть этот узел. Обновите количество displayValue и нажмите новую dbid
 const obj = [
  { dbId: 26598, properties: [{ attributeName: "BIM7AATypeCode" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "221" }] },
  { dbId: 26591, properties: [{ attributeName: "BIM7AATypeCode" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "221" }] },
  { dbId: 3695, properties: [{ attributeName: "abc" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "123" }] },
  { dbId: 3697, properties: [{ attributeName: "abc" }, { displayCategory: "Identity Data" }, { displayName: "BIM7AATypeCode" }, { displayValue: "123" }] },
];
const output = obj.reduce((acc, curr) => {
  const attribute = curr.properties.find(node => node.attributeName);
  const displayValue = curr.properties.find(node => node.displayValue);
  if (acc[attribute.attributeName]) {
    acc[attribute.attributeName][displayValue.displayValue] ? acc[attribute.attributeName][displayValue.displayValue]   : acc[attribute.attributeName][displayValue.displayValue] = 1;
    acc[attribute.attributeName].dbid.push(curr.dbId);
  } else {
    const newAttribute = {
      [displayValue.displayValue]: 1,
      dbid: [curr.dbId]
    }
    acc[attribute.attributeName] = newAttribute;
  }
  return acc;
}, {});
console.log(output);