2016-08-08 14 views
0

私はいつか私のアイテムにインデックスとコードでいつかアクセスする必要があります。整数インデックスと文字列インデックスを混在させるのは良い考えですか?添え字配列と "連想配列"

データのロード後にコード、インデックス、アイテムの量が決して変化しないことに注意してください。

私は、同じオブジェクトがプッシュされ、ハッシュテーブルとして設定されているこのようなことを行うと考えています。私はアイテムを見つけるためにループに使用する前に

dataList[0].dataValue 
dataList["C1"].dataValue 

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; 
} 

それから私はどちらかとオブジェクトにアクセスすることができるだろう。

function findItemByCode(code) { 
    for (var i = 0; i < dataList.length; i++) { 
     if (dataList[i].code == code) { 
      return dataList[i]; 
     } 
    } 

    return null; 
} 

findItemByCode("C1").dataValue 
+1

JavaScriptを使用して、私の試みです。それは配列を持ち、オブジェクトを持っています。 –

+0

並べ替えと並べ替えの両方を行うことは興味深い考えです。そしてオブジェクトは参照によって渡されるので。テーブル内のオブジェクトのプロパティの変更は、他のオブジェクトにも反映されます。 – Mic

答えて

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

すべてのキーが異なります。あなたは私にここで良いアイデアを与えました、私はこれのような何かを(より良い命名で)行います。 var dataIndex = {byCode:{}、dataList:[]}; –

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);