将"number strings"作为对象键不好吗?



我有两个API可以使用,它们不能更改。其中一个返回类型如下:

{
type: 25
}

和其他API我应该发送这样的类型:

{
type: 'Computers'
}

其中CCD_ 1。我想要的是一个数字索引到字符串值的映射,如下所示:

{
'1': 'Food',
'2': 'Something',
....
'25': 'Computers'
....
}

我不知道为什么,但有这样一个从数值到字符串的映射感觉不对,但也许它完全可以?我试着用谷歌搜索答案,但找不到任何具体的答案。在一个地方,它说这很好,在另一个地方有人说最好不要把数值作为对象键。那么,谁是对的,为什么?有人能帮我回答这个问题吗?

谢谢:(

它没有什么问题,但我能理解它看起来有点奇怪。一种选择是有一个对象数组,每个对象都有自己的id,然后可以在上使用filter/find

const arr = [ { id: 1, label: 'Food' }, { id: 2, label: 'Something' }, { id: 25, label: 'Computers' } ];
const id = 25;

function getLabel(arr, id) {
return arr.find(obj => obj.id === id).label;
}
console.log(getLabel(arr, id));

如果使用常规对象感觉"奇怪",则可以使用Map对象。

const map = new Map()
map.set(25, 'Computers');
map.set(1, 'Food');
// then later
const computers = map.get(25);
// or loop over the map with 
map.forEach((id, category) => {
console.log(id, category);
});

快速更新:

正如其他人所提到的,使用具有key=value对的对象是可以的。最终,javascript中的所有内容都是一个对象(包括数组(

使用键值对或Map有一个很大的优势(在某些情况下,它会产生巨大的差异(,那就是具有"索引"的数据结构。您不必搜索整个阵列就能找到您要查找的内容。

const a = data[id]; 

几乎是即时的,而如果您在对象数组中搜索id。。。这完全取决于你的搜索算法和数组的大小。如果处理由某个渲染循环函数不断更新/搜索的大型数组,则在数组上使用"索引"对象可以获得更好的性能。

Map的优点是保持键值对的插入顺序,而且它只对您设置的属性进行迭代。当循环对象属性时,您必须检查该属性是否属于该对象,并且不是通过原型链(hasOwnProperty("继承"的

m = new Map()
m.set(5, 'five');
m.set(1, 'one');
m.set(2, 'two');
// some other function altered the same object
m.__proto__.test = "test";
m.forEach((id, category) => {
console.log(id, category);
});
/*
outputs:
five 5
one 1
two 2
*/
o = {};
o[5] = 'five';
o[1] = 'one';
o[2] = 'two';
// something else in the code used the same object and added a new property
// which you are not aware of.
o.__proto__.someUnexpectedFunction = () => {}
for (key in o) {
console.log(key, o[key]);
}
/*
Output:
1 one
2 two
5 five
someUnexpectedFunction () => {}
*/

地图和对象还有一个非常重要的优势(有时是劣势——取决于您的需求(。映射/对象/集可确保索引值是唯一的。这将自动从结果集中删除任何重复项。对于数组,每次都需要检查元素是否已经在数组中。

相关内容

最新更新