因为我需要通过索引访问我的项目,有时需要通过代码访问我的项目。将整数索引与字符串索引混合是一个好主意吗?
请注意,在加载数据后,代码,索引,项目数量永远不会更改。
我正在考虑做这样的事情,将同一个对象推送并设置为哈希表。
function DataInformation(code, dataValue) {
this.code = code;
this.dataValue = dataValue;
}
var dataList = [];
function fillDataList() {
addNewData(new DataInformation("C1", 111));
addNewData(new DataInformation("C2", 222));
addNewData(new DataInformation("C3", 333));
}
function addNewData(newData) {
dataList.push(newData);
dataList[newData.code] = newData;
}
然后我可以使用以下任一方式访问该对象:
dataList[0].dataValue
dataList["C1"].dataValue
在我习惯循环找到项目之前。
function findItemByCode(code) {
for (var i = 0; i < dataList.length; i++) {
if (dataList[i].code == code) {
return dataList[i];
}
}
return null;
}
findItemByCode("C1").dataValue
答案 0 :(得分:3)
您是否需要按严格顺序迭代dataList
?或者它只是您想要通过某个键随机访问的一包物品?
如果不考虑有序迭代,请使用对象而不是数组。但请注意关键冲突。
var dataList = {};
function addNewData(newData) {
dataList[newData.code] = newData;
dataList[newData.dataValue] = newData;
}
// that's it, no other changes necessary
如果可能发生键冲突 - 或者需要进行有序迭代,或者只是想让它特别干净,请使用数组和附带的索引对象。
var dataList = [];
var dataIndex = {
byCode: {},
byValue: {}
};
function addNewData(newData) {
dataList.push(newData);
dataIndex.byCode[newData.code] = newData;
dataIndex.byValue[newData.dataValue] = newData;
}
答案 1 :(得分:0)
以下是我尝试使用Proxies
// Code goes here
function DataInformation(code, dataValue) {
this.code = code;
this.dataValue = dataValue;
}
var _dataList = [];
var dataList = new Proxy(_dataList, {
get: function(target, name) {
if (target && target.myMap && target.myMap[name]) return target[target.myMap[name]];
return target[name];
},
set: function(obj, prop, value) {
// The default behavior to store the value
obj.myMap = obj.myMap || {};
obj.myMap[value.code] = prop;
obj[prop] = value;
return true;
}
});
function fillDataList() {
addNewData(new DataInformation("C1", 111));
addNewData(new DataInformation("C2", 222));
addNewData(new DataInformation("C3", 333));
}
function addNewData(newData) {
dataList.push(newData);
}
fillDataList();
console.log(dataList[0].dataValue);
console.log(dataList["C1"].dataValue);
&#13;