如何基于属性名称

时间:2019-01-17 02:05:54

标签: javascript arrays lookup-tables

来自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次。

编辑: 经过由Adrian Brand和SomePerformance的答案进行的更多研究之后,很明显,我正在尝试使用JavaScript不支持的实际数组创建关联数组。似乎可以添加命名的arrray元素,但是您不能按名称访问它们,而只能按整数访问。 (请注意,我相信我读过这会导致意外状态)

如下所示,唯一的选择是使用普通对象。出人意料的是,它表现出色。

关于“未定义”的有趣帖子:Detecting an undefined object property

希望我可以同时选择“阿德里安品牌”和“某些性能”答案,因为它们都极大地帮助了他们。

1 个答案:

答案 0 :(得分:0)

现在,您正在将具有单个uniqueID属性的对象推入数组; list[someUniqueId]不起作用,因为uniqueID将是数组中 item的属性,而不是数组本身。只需使用一个对象即可:

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

然后您可以使用

var var1Val = list[uniqueID].var1

如果有迹象表明您总是从中访问属性(即uniqueID),则最好不要在代码中的任何位置使用数组。

  

还有什么合适的检查方法:

if(list[uniqueID] === undefind)

只需更改为undefined,就可以正常工作。