如何根据 属性 名称使用对象数组作为查找 table
How to use array of objects as lookup table based on property name
来自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);
}
read/access:
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)
我正在尝试比较使用 属性 名称作为查找 table 键的性能,而不是循环,因为数组可能有 1000 个元素并且是每秒访问 1000 次。
编辑:
在根据 Adrian Brand 和 CertainPerformance 的回答进行更多研究后,很明显我正在尝试使用 javascript 不支持的实际数组创建关联数组。似乎您可以添加命名数组元素,但您不能通过名称访问它们,只能通过整数访问它们。 (注意,我相信我读到这会导致意想不到的状态)
如下所示,唯一的选择是使用普通对象。令人惊讶的是非常高效。
post 在 'undefined' 上也很有趣:Detecting an undefined object property
希望我能 select Adrian Brand 和 CertainPerformance 的回答,因为他们都提供了极大的帮助。
现在,您正在将具有单个 uniqueID
属性 的对象推送到数组; list[someUniqueId]
将不起作用,因为 uniqueID
将是数组 中的 项的 属性,而不是数组本身。只需使用一个对象即可:
var listObj = {};
for(someCount){
var uniqueID = uuidv4();
listObj[uniqueID] = {
var1: 1,
var2: 2,
};
}
然后你就可以访问
var var1Val = list[uniqueID].var1
如果您有指示总是从(即 uniqueID
s)访问属性,最好不要在代码中的任何地方使用数组。
Also whats the proper way to check:
if(list[uniqueID] === undefind)
只要改成undefined
,应该就可以了。
来自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);
}
read/access:
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)
我正在尝试比较使用 属性 名称作为查找 table 键的性能,而不是循环,因为数组可能有 1000 个元素并且是每秒访问 1000 次。
编辑: 在根据 Adrian Brand 和 CertainPerformance 的回答进行更多研究后,很明显我正在尝试使用 javascript 不支持的实际数组创建关联数组。似乎您可以添加命名数组元素,但您不能通过名称访问它们,只能通过整数访问它们。 (注意,我相信我读到这会导致意想不到的状态)
如下所示,唯一的选择是使用普通对象。令人惊讶的是非常高效。
post 在 'undefined' 上也很有趣:Detecting an undefined object property
希望我能 select Adrian Brand 和 CertainPerformance 的回答,因为他们都提供了极大的帮助。
现在,您正在将具有单个 uniqueID
属性 的对象推送到数组; list[someUniqueId]
将不起作用,因为 uniqueID
将是数组 中的 项的 属性,而不是数组本身。只需使用一个对象即可:
var listObj = {};
for(someCount){
var uniqueID = uuidv4();
listObj[uniqueID] = {
var1: 1,
var2: 2,
};
}
然后你就可以访问
var var1Val = list[uniqueID].var1
如果您有指示总是从(即 uniqueID
s)访问属性,最好不要在代码中的任何地方使用数组。
Also whats the proper way to check:
if(list[uniqueID] === undefind)
只要改成undefined
,应该就可以了。