将索引数组与“关联数组”混合

时间:2016-08-08 14:41:39

标签: javascript arrays

因为我需要通过索引访问我的项目,有时需要通过代码访问我的项目。将整数索引与字符串索引混合是一个好主意吗?

请注意,在加载数据后,代码,索引,项目数量永远不会更改。

我正在考虑做这样的事情,将同一个对象推送并设置为哈希表。

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

2 个答案:

答案 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

&#13;
&#13;
// 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;
&#13;
&#13;