将“数字字符串”用作对象键是否不好?

时间:2018-12-02 15:33:14

标签: javascript object numeric

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

{
    type: 25
}

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

{
    type: 'Computers'
}

其中25 == 'Computers'。我想拥有的是数字索引到字符串值的映射,如下所示:

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

我不确定为什么,但是将这样的带有数字值的映射映射到字符串并不正确,但是也许完全可以吗?我尝试用Google搜索答案,但找不到任何具体的内容。在一个地方,它说很好,在另一个地方,它最好不要将数字值用作对象键。那么,谁是正确的,为什么?有人可以帮我解决这个问题吗?

谢谢:)

2 个答案:

答案 0 :(得分:2)

它没有什么问题,但是我可以理解它看起来有点像弯弯曲曲的样子。一种替代方法是拥有一组对象,每个对象都有自己的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));

答案 1 :(得分:0)

如果使用常规对象感到“怪异”,则可以使用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具有1个大优点(在某些情况下,它会产生很大的不同),并且具有“索引”数据结构。您无需搜索整个阵列即可找到所需的内容。

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 () => {}
*/

地图和对象也有1个非常重要的优点(有时是缺点-取决于您的需要)。地图/对象/集合可确保索引值是唯一的。这将自动从结果集中删除所有重复项。 使用数组时,您需要每次检查元素是否已在数组中。