创建对的列表/集合的有效方法:TypeScript/JavaScript中的数字枚举键和对象



什么是最简单的对列表:TypeScript/JavaScript中的{enum(numeric) - object}

假设我们有这样的示例代码:

// interface for some objects
export interface ObjI {
num: number;
str: string;
}
// some objects
export const objA: ObjI = {
num: 10000,
str: "AAAA",
};
export const objA1: ObjI = {
num: 100001,
str: "AAA1",
};
export const objB: ObjI = {
num: 200000,
str: "BBB",
};
export const objB2: ObjI = {
num: 200000,
str: "BBB",
};
export const objC: ObjI = {
num: 333,
str: "CCC",
};
// enum of indexes - normally larger values
enum objEnum {
A = 10,
A1 = 11,
A2 = 12,
B = 20,
B8 = 28,
C = 30,
C7 = 37,
C9 = 39,
}
// output tests
export class TestValues {
run() {
const ar: ObjI[] = [];
ar[objEnum.A2] = objA;
ar[objEnum.B8] = objB;
ar[objEnum.C9] = objC;
let ix: number;
console.log("-----");
// This returns:
//  0 " val: " "AAAA"
//  1 " val: " "BBB"
//  2 " val: " "CCC"
ix = 0;
ar.forEach((o) => console.log(ix++, " val: ", o.str));
console.log("-----");
// This returns:
//  0 - 39 lines - 40 elements
ix = 0;
for (let o of ar) {
console.log(ix++, " val: ", o ? o.str : "-");
}
console.log("-----");
// This returns:
//  0, 1, 2
ix = 0;
for (let o in ar) {
// THIS CANNOT BE USED - error:
// Property 'str' does not exist on type 'string'.ts(2339)
//console.log(ix++, ' val: ', o.str);
console.log(ix++);
}
}
}

问题:

在数组"ar[39] = xxx"中,TypeScript似乎在内存中生成了从0到39的40个元素。

这是真的吗?如果是这样的话,考虑到我们只添加了3个元素,数组将不是合适的应用类型,这将是一种浪费或资源。

创建{number - object}对的各种组的列表的最有效方法是什么?给定的数字索引可能不是按1的顺序排列,而是具有更高值的数字,例如1001、1202、1307等,如示例数组"ar[]"中所示?

在数组‘ar[39]=xxx’中,TypeScript在内存中生成从0到39的40个元素。这是真的吗?

没有。

const arr = []
arr[39] = 'hello'
console.log(Object.keys(arr)) // [39]

请注意,"39"是此数组所具有的唯一密钥。这是如何在幕后实施的可能有些不清楚。在最坏的情况下,它将直到最大索引的整数存储为键,将undefined存储为值,这根本不会消耗太多内存。


创建{数字-对象}对的各种组的列表的最有效方法是什么?

也就是说,如果要将整数键映射到值,则可能需要一个普通对象或Map。数组通常用于数据列表,其中顺序仅在相对意义上重要(项目0应出现在项目1之前(。但是,如果您想通过某个唯一的键获取每个项,数组通常不是您想要的。

作为地图:

const map: Map<number, ObjI> = new Map();
map.set(objEnum.A2, objA);
map.set(objEnum.B8, objB);
map.set(objEnum.C9, objC);
for (const [k, v] of map) {
console.log(k, v)
}
// "12",  { "num": 10000, "str": "AAAA" } 
// "28",  { "num": 200000, "str": "BBB" } 
// "39",  { "num": 333, "str": "CCC" } 

或者一个带有索引签名的普通对象也可以:

const obj: { [key: number] : ObjI } = {};
obj[objEnum.A2] = objA;
obj[objEnum.B8] = objB;
obj[objEnum.C9] = objC;
for (const [k, v] of Object.entries(obj)) {
console.log(k, v)
}
// "12",  { "num": 10000, "str": "AAAA" } 
// "28",  { "num": 200000, "str": "BBB" } 
// "39",  { "num": 333, "str": "CCC" } 

游乐场

相关内容

  • 没有找到相关文章

最新更新