Разве плохо иметь «числовые строки» в качестве ключей объекта? - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть два API для работы, и их нельзя изменить.Один из них возвращает тип, подобный этому:

{
    type: 25
}

, а другому API я должен отправить тип, подобный этому:

{
    type: 'Computers'
}

, где 25 == 'Computers'.То, что я хочу иметь, - это сопоставление числовых индексов со строковым значением, например:

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

Я не уверен, почему, но неправильно иметь такую ​​карту с числовым значением в строке,но, может быть, это совершенно нормально?Я попытался найти ответ в Google, но ничего конкретного не нашел.В одном месте написано, что все в порядке, в другом люди говорят, что в качестве ключей объекта лучше не использовать числовые значения.Итак, кто прав и почему?Может ли кто-нибудь помочь мне с этим вопросом?

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Вы можете использовать объект 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);
});

Быстрое обновление:

Как уже упоминалось, использование объектов с парами ключ = значениевсе в порядке.В конце концов, все в javascript является объектом (включая массивы)

Использование пар ключ-значение или Map имеет 1 большое преимущество (в некоторых случаях это имеет огромное значение), и это имеет «индексированный»структура данных.Вам не нужно искать весь массив, чтобы найти то, что вы ищете.

const a = data[id]; 

почти мгновенно, тогда как если вы ищете идентификатор в массиве объектов ... все зависит от вашего алгоритма поиска и размера массива.Использование «индексированного» объекта над массивом дает гораздо лучшую производительность, если иметь дело с большими массивами, которые постоянно обновляются / ищутся с помощью некоторой функции рендеринга.

Преимущество карты состоит в том, что она поддерживает порядок вставки ключей.пары значений, и он также перебирает только те свойства, которые вы установили.При зацикливании свойств объекта необходимо убедиться, что свойство принадлежит этому объекту и не «наследуется» через цепочку прототипов (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 очень важное преимущество (иногда недостаток)- в зависимости от ваших потребностей).Карты / объекты / наборы гарантируют, что ваши проиндексированные значения являются уникальными.Это автоматически удалит все дубликаты из вашего набора результатов.С массивами вам нужно будет каждый раз проверять, есть ли элемент в массиве или нет.

0 голосов
/ 02 декабря 2018

В этом нет ничего плохого, но я могу понять, как это может выглядеть немного странно.Одна из альтернатив - иметь массив объектов, каждый из которых имеет свой собственный идентификатор, который затем можно filter / find on:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...