#typescript
#typescript
Вопрос:
У меня есть различные данные массива, которые выглядят следующим образом:
Countries: [{code: "USA", countryDesc: "United States"},{code: "MEX", countryDesc: "Mexico"}]
и
States: [{code: "NY", countryDesc: "New York"},{code: "VA", stateDesc: "Virginia"}]
То, что я хочу иметь возможность сделать, это преобразовать конкретный code / countryDesc или code / stateDesc в «общую» пару значений ключа для использования. Следовательно, моя процедура преобразования предоставит мне это:
[{key:"USA", value:"United States"},{key:"MEX", value:"Mexico"}]
и
[{key:"NY", value:"New York"},{key:"VA", value:"Virginia"}]
Моя цель — написать функцию, которая принимает массив и имена свойств для ключа и значения, а затем преобразует их в массив с ключом и значением вместо других имен свойств.
Что у меня есть, так это:
export interface IAnyArray {
key: string;
value: string;
}
const convertToKeyValue = (
array: IAnyArray[],
keyname: string,
valuename: string
) => {
if (array amp;amp; array.length > 0) {
return array.map((a) => {
return { key: a[keyname], value: array[valuename] };
});
}
};
Я получаю сообщение об ошибке:
Элемент неявно имеет тип ‘any’, поскольку выражение типа ‘string’ нельзя использовать для индексации типа ‘IAnyArray’. Для типа ‘IAnyArray’.ts (7053) не найдено подписи индекса с параметром типа ‘string’.
как для [keyname], так и для [valuename] в функции.
Вот как я бы это сделал, в зависимости от ввода, но я бы хотел, чтобы «общий» механизм, если это возможно:
const convertCountriesToKeyValue = (
countries: { code: string; countryDesc: string }[]
) => {
return countries.map((country) => {
return { key: country.code, value: country.countryDesc };
});
};
Я искал в Интернете, и я не могу найти ничего полезного, чтобы помочь с этой проблемой.
Я был бы признателен за любую помощь в этом. Спасибо.
Ответ №1:
Если я правильно понял ваш вопрос, вы хотите передать массив объектов с любыми именами свойств, но вернуть IAnyArray . Может быть, что-то вроде этого?
const convertToKeyValue = <T extends any>(
array: T[],
keyname: keyof T,
valuename: keyof T
) => {
return array.map((a) => {
return { key: a[keyname], value: a[valuename] };
});
};
const countries = [{ code: "USA", countryDesc: "United States" }, { code: "MEX", countryDesc: "Mexico" }];
const keyValueCountries = convertToKeyValue(countries, "code", "countryDesc");
Ответ №2:
Из вашего описания это должно быть то, что вы ищете:
const convertToKeyValue = (
array: IAnyArray[],
keyName: string,
valueName: string
) => {
return array.map((a) => {
return {[keyName]: a.key, [valueName]: a.value}
})
}
Примечание: я бы рекомендовал сохранить
keyName
иvalueName
в качестве первых двух параметров (как я сделал на игровой площадке), чтобы сделать функцию более составной, если вы решите использовать ее в будущем.