将Typescript数组重构为JSON对象有问题吗



我有一个函数,它将字符串分解为关键字子字符串数组,其中"你好";给出

keywords
0: "h"
1: "he"
2: "hel"
3: "hell"
5: "hello"

我需要重构成一个json对象:

keywords
"h": true
"he": true
"hel": true
"hell": true
"hello": true

工作阵列功能为

function createKeywords (name: string) {
const keywords: string[] = [];
let keyword = "";
name.split("").forEach((letter) => {
keyword += letter;
keywords.push(keyword);
});
return keywords;
};

而我失败的重构尝试是

function createKeywords (name: string) {
const keywords: {text: string, value: boolean}[] = [];
let keyword = "";
name.split("").forEach((letter) => {
keyword += letter;
keywords[keyword] = true; // Element implicitly has an 'any' type because index expression is not of type 'number'.
});
return keywords;
};

哪个给出了上述错误?

这里需要进行一些更改。首先,keywords应该是一个对象,而不是一个对象数组。其次,{text: string, value: boolean}是一个对象,其属性text是字符串,属性value是布尔值。您要查找的是一个具有字符串键和布尔值的对象,即{[key: string]: boolean}。这是更新后的代码:

function createKeywords (name: string): {[key: string]: boolean} {
const keywords: {[key: string]: boolean} = {};
let keyword = "";
name.split("").forEach((letter) => {
keyword += letter;
keywords[keyword] = true;
});
return keywords;
}

或者,{[key: string]: boolean}可以表示为Record<string, boolean>

这是因为您使用了一个具有非数字索引的数组来存储键:值对。事实上,如果抑制错误,结果就是

[ h: true, he: true, hel: true, hell: true, hello: true ]

你应该使用一个对象。这是一种可以实现的方法

function createKeywords(name: string) {
let out: { [k: string]: boolean } = {};
name.split("").forEach((_, i) => {
const key = name.substr(0, i + 1);
out[key] = true;
});
return out;
}

返回

{ h: true, he: true, hel: true, hell: true, hello: true }

您可以修改函数createKeywords()以返回对象而不是数组,也可以让它保持不变,并使用它返回的值来产生预期的结果。

例如:

function createKeywords (name) {
const keywords = [];
let keyword = "";
name.split("").forEach((letter) => {
keyword += letter;
keywords.push(keyword);
});
return keywords;
};
const keywords = createKeywords('hello');
const asObject = Object.fromEntries(
keywords.map((k) => [k, true])
);
console.log(keywords);
console.log(asObject);

阅读Object.fromEntries()Array.map()

最新更新