我有一个函数,它将字符串分解为关键字子字符串数组,其中"你好";给出
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()
。