Сокращение временных затрат и возврат отформатированных объектов

#javascript #typescript #algorithm #ecmascript-6

#javascript #typescript #алгоритм #ecmascript-6

Вопрос:

У нас есть объект JSON, который состоит из записей, в которых нам нужно создать json в определенных форматах, чтобы созданный объект можно было использовать в будущем: ниже приведен JSON, из которого нам нужно создать еще шесть объектов JSON, которые состоят из уникальных (3) и сгруппированных (3) записей.

 [
{
  "Tin": "123123", "TinName": "TinName1",
  "Npi": "1234", "NpiName": "Sample1",
  "Speciality": "Speciality1"
},
{
  "Tin": "123123", "TinName": "TinName1",
  "Npi": "2345", "NpiName": "Sample2",
  "Speciality": "Speciality2"
},
{
  "Tin": "234234", "TinName": "TinName2",
  "Npi": "3456", "NpiName": "Sample3",
  "Speciality": "Speciality3"
},
{
  "Tin": "345345", "TinName": "TinName3",
  "Npi": "3456", "NpiName": "Sample3",
  "Speciality": "Speciality4"
},
{
  "Tin": "456456", "TinName": "TinName4",
  "Npi": "4567", "NpiName": "Sample4",
  "Speciality": "Speciality4"
}
]
  

Вы можете обнаружить, что каждый ключ Tin, Npi и Speciality имеет несколько записей, сопоставленных с другими ключами.(Например. Я показал 2 записи [tin: 123123 имеет два NPI 1234,2345]).

Уникальные банки:

 [{Tin: "123123", TinName: "TinName1"}
{Tin: "234234", TinName: "TinName2"}
{Tin: "345345", TinName: "TinName3"}
{Tin: "456456", TinName: "TinName4"}]
  

Уникальные Npi:

 [{Npi: "1234", NpiName: "Sample1"}
{Npi: "2345", NpiName: "Sample2"}
{Npi: "3456", NpiName: "Sample3"}
{Npi: "4567", NpiName: "Sample4"}]
  

Уникальная специальность:

 [{Speciality: "Speciality1"}
{Speciality: "Speciality2"}
{Speciality: "Speciality3"}
{Speciality: "Speciality4"}]
  

Групповые банки. (Таким образом, также создаются групповые NPI и групповые специальности.)

 {
 123123: [
  {
    "TinName": "TinName1",
    "Npi": "1234", "NpiName": "Sample1",
    "Speciality": "Speciality1"
  },
  {
    "TinName": "TinName1",
    "Npi": "2345", "NpiName": "Sample2",
    "Speciality": "Speciality2"
  }
 ],
  234234: [
  {
    "TinName": "TinName2",
    "Npi": "3456", "NpiName": "Sample3",
    "Speciality": "Speciality3"
  }
 ],
  345345: [
  {
    "TinName": "TinName3",
    "Npi": "3456", "NpiName": "Sample3",
    "Speciality": "Speciality4"
  }
 ],
  456456: [
  {
    "TinName": "TinName4",
    "Npi": "4567", "NpiName": "Sample4",
    "Speciality": "Speciality4"
  }
 ]
}
  

Код: я использовал map() и reduce(), чтобы можно было получать уникальные записи. Для сгруппированных я использовал reduce() . Но из кода временная сложность увеличится для миллионов записей. Есть ли какой-либо способ получить результат за одно или два взаимодействия.

           //uniq Tin
          finalJson[0] = jsonFile.map(item => ({
            Tin: item.Tin,
            TinName: item.TinName
          })).reduce(function (previous, current) {
            const object = previous.filter(i => i.Tin === current.Tin);
            if (object.length === 0) {
              previous.push(current);
            }
            return previous;
          }, []);

          //uniq Npi
          finalJson[1] = jsonFile.map(item => ({
            Npi: item.Npi,
            NpiName: item.NpiName
          })).reduce(function (previous, current) {
            const object = previous.filter(i => i.Npi === current.Npi);
            if (object.length === 0) {
              previous.push(current);
            }
            return previous;
          }, []);

          //unq Speciality
          finalJson[2] = jsonFile.map(item => ({
            Speciality: item.Speciality
          })).reduce(function (previous, current) {
            const object = previous.filter(i => i.Speciality === current.Speciality);
            if (object.length === 0) {
              previous.push(current);
            }
            return previous;
          }, []);

          //groupedTin
            finalJson[3] = jsonFile.reduce((acc, cur) => {
            const { Tin, ...rest } = cur;
            if (!acc[Tin]) {
              acc[Tin] = [];
            }
            acc[Tin].push(rest);
            return acc;
          }, {});

          //groupedNpi
           finalJson[4] = jsonFile.reduce((acc, cur) => {
            const { Npi, ...rest } = cur;
            if (!acc[Npi]) {
              acc[Npi] = [];
            }
            acc[Npi].push(rest);
            return acc;
          }, {});

          //groupedSpeciality
          finalJson[5] = jsonFile.reduce((acc, cur) => {
            const { Speciality, ...rest } = cur;
            if (!acc[Speciality]) {
              acc[Speciality] = [];
            }
            acc[Speciality].push(rest);
            return acc;
          }, {});


          
  

Ответ №1:

прежде всего, вы должны объединить map и reduce . Пожалуйста, смотрите следующий пример:

 // Instead of

finalJson[0] = jsonFile.map(item => ({
    Tin: item.Tin,
    TinName: item.TinName
})).reduce(function (previous, current) {
    const object = previous.filter(i => i.Tin === current.Tin);
    if (object.length === 0) {
        previous.push(current);
    }
    return previous;
}, []);

// Please try
jsonFile[0].reduce((previous, { Tin, TinName }) =>
    !previous.some(i => i.Tin === Tin)
        ? [...previous, { Tin, TinName }]
        : previous, []
)
  

Приведенный выше пример — просто подсказка для вас. Нет необходимости в цепочке filter / map / reduce, вы можете использовать почти всегда только reduce.

Пожалуйста, имейте в виду, что обратный вызов reduce получает третий аргумент — индекс элемента. Таким образом, вместо записи finalJson[3] вы можете просто проверить в reduce обратный вызов индекса.

Честно говоря, у меня недостаточно времени для более расширенного ответа.

Комментарии:

1. Я искал оптимизированное решение, в котором за одну итерацию можно создать все uniq Json и единую интеграцию для сгруппированного json.