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