Как использовать массив объектов в качестве справочной таблицы на основе имени свойства - PullRequest
0 голосов
/ 17 января 2019

С https://codereview.stackexchange.com/questions/25858/json-lookup-by-key
У меня есть следующее, которое работает:

var data = [
        {
            "Key": "2222-2222-2222",
            "Email": "a@test.com"
        },
        {
            "Key": "1111-1111-1111",
            "Email": "test@test.com"
        }
    ],
    lookup = {};

// generate the lookup table for reuse
data.forEach(function (el, i, arr) {
    lookup[el.Key] = el.Email;
});

// returns 'test@test.com'
print(lookup['1111-1111-1111']);

То, что я хочу сделать (нажать работает, доступ не):

нажатие (проверка данных населения):

var list = [];
for(someCount){
   var uniqueID = uuidv4();
   var objToAdd = {};
   var objChild = {};
   objChild.var1 = 1;
   objChild.var2 = 2;

   objToAdd[uniqueID] = objChild;
   list.push(objToAdd);
}

читать / доступ:

var var1Val = list[uniqueID].var1

or

for(var i = 0; i < list.length; i++){
    if(list[i] === uniqueID){
        var var1Val = list[i].var1
    }
}

Also whats the proper way to check:
if(list[uniqueID] === undefined)

Я пытаюсь сравнить производительность использования имени свойства в качестве ключа для таблицы поиска, в отличие от цикла, поскольку массив может иметь 1000 элементов и доступ к ним 1000 раз в секунду.

Edit: После небольшого исследования, основанного на ответах Адриана Брэнда и CertainPerformance, стало ясно, что я пытался создать ассоциативный массив с использованием фактического массива, который не поддерживается javascript. Кажется, что вы можете добавить именованные элементы массива, но вы не можете получить к ним доступ по имени, только по целому числу. (будьте осторожны, я думаю, что прочитав это приводит к неожиданным состояниям)

Как показано ниже, единственным вариантом является использование простого объекта. Удивительно очень производительно.

Также интересный пост на 'undefined': Обнаружение неопределенного свойства объекта

Жаль, что я не мог бы выбрать ответы как Adrian Brand, так и CertainPerformance, поскольку они оба очень помогли.

1 Ответ

0 голосов
/ 17 января 2019

Прямо сейчас вы помещаете объект с единственным свойством uniqueID в массив;list[someUniqueId] не будет работать, потому что uniqueID будет свойством элемента в массиве , а не самого массива.Вместо этого просто используйте объект:

var listObj = {};
for(someCount){
  var uniqueID = uuidv4();
  listObj[uniqueID] = {
    var1: 1,
    var2: 2,
  };
}

И тогда вы можете получить доступ с помощью

var var1Val = list[uniqueID].var1

Если у вас есть признаки того, что вы всегда обращаетесь к свойствам из (то есть uniqueID)s), вероятно, лучше не использовать массив где-либо в коде.

Также как правильно проверить:

if(list[uniqueID] === undefind)

Просто измените на undefinedи это должно работать просто отлично.

...