我需要一个javascript数组或对象,或者可能是为此任务混合的东西:
我有这个属性: 顾客 项目 条形码
So I will fill all fields with loop like this:
customer = 1
item = 1
barcode = 5555
customer = 1
item = 2
barcode = 6666
客户和商品的组合将是唯一的,所以我想直接访问价值(条形码),如下所示:
“给我条形码值,其中customer = 1和item 1,所以结果必须是5555”
我不想使用循环来查找值,我希望直接访问。
谢谢!
目前,我已经创建了示例脚本。我的问题还有什么更好的吗?
function cacheBarcodes() {
var results = [];
// Here the database is pushing all 100k+ records to the array
results.push(['1', '1', '5555']);
results.push(['1', '2', '6666']);
return results;
}
function getBarcode(results,customer,item) {
for (var i = 0; i < results.length; i++) {
var db_customer = results[i][0];
var db_item = results[i][1];
var db_barcode = results[i][2];
if (db_customer == customer && db_item == item ) {
return db_barcode;
}
}
}
results = cacheBarcodes();
alert(getBarcode(results,'1','1'));
答案 0 :(得分:1)
首先,需要将最重要的事情排除在外:这是一个糟糕的想法。实际上不要这样做,除非你方式确定你需要:
var salt = "___";
var genKey = function(r) {
return '' + r.customer + salt + r.item;
};
var barcodes = {};
records.forEach(function(r) {
var key = genKey(r);
barcodes[key] = r.barcode;
});
现在,您可以使用记录调用genKey
来访问条形码,以获取函数调用和散列查找的成本,而不是循环遍历记录数组。正如Anirudha在评论中指出的那样,你可能一无所获。如果你在其上放置一个界面,它会变得更好(在清洁度,而不是性能方面):
class Lookup {
constructor () {
this._barcodes = {};
}
_genKey (customer, item) {
return '' + customer + '___' + item;
}
addRecord (r) {
let key = this._genKey(r.customer, r.item);
this._barcodes[key] = r.barcode;
return this;
}
getBarcode (customer, item) {
let key = this._genKey(customer, item);
return this._barcodes[key];
}
};