我有两个可以使用的API,它们不能更改。其中之一返回的类型如下:
{
type: 25
}
和其他API我应该发送这样的类型:
{
type: 'Computers'
}
其中25 == 'Computers'
。我想拥有的是数字索引到字符串值的映射,如下所示:
{
'1': 'Food',
'2': 'Something',
....
'25': 'Computers'
....
}
我不确定为什么,但是将这样的带有数字值的映射映射到字符串并不正确,但是也许完全可以吗?我尝试用Google搜索答案,但找不到任何具体的内容。在一个地方,它说很好,在另一个地方,它最好不要将数字值用作对象键。那么,谁是正确的,为什么?有人可以帮我解决这个问题吗?
谢谢:)
答案 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个非常重要的优点(有时是缺点-取决于您的需要)。地图/对象/集合可确保索引值是唯一的。这将自动从结果集中删除所有重复项。 使用数组时,您需要每次检查元素是否已在数组中。