2017-05-10 38 views
1

私はJSの既存のコードに迷惑をかけています。コードは機能しているので、私はそれを変更するために急いで急いではありませんが、以下の重複は私を悩ます。この状況を回避するための通常の/推奨/正式な方法は何ですか?キー/データの重複を避ける

実際のシステムは、大規模/複雑な金融システムであるので、私は、問題を示し、最も基本的な例にそれを単純化しています

var colours={ 
    red:{id:"red", vals:[1,0,0]}, 
     green:{id:"green", vals:[0,1,0]}, 
     grey:{id:"grey", vals:[0.5,0.5,0.5]} 
// ...etc 
    }; 

// id needs to be known internally within the object - thus it is defined as a property. 
// e.g: 
colour.prototype.identify(console.log(this.id)); 

// id also needs to be used externally to find an object quickly. 
// e.g: 
function getcolour(s){return colours[s];} 

// Although this works. It does mean duplicating data, with the theoretical possibility of a mismatch: 
var colours={//... 
     blue:{id:"green", // oh dear... 

これはどのように、通常は専門家によって処理されるのでしょうか?

+0

は[lodash](httpsに見てみましょう渡ししたいと思います://lodash.com/)library –

答えて

1

この質問は多少主観的です。

私のアプリケーションを作成するときに、私は一般的に次のことを行うのですか試してみてください。

  • 複数の場所で同じデータを定義することはありません。ソースは常に明白でなければなりません
  • 私がより速く/より簡単にアクセスできるようにインデックスを作成する必要がある場合は、ユーティリティメソッドを使用して行います。これらのメソッドは適切にユニットテストされていなければなりませんので、間違ったことをしても疑いはありません。
  • コードの量を最小限に抑えるために、サードパーティのライブラリを可能な限り使用してください(例:lodashやアンダースコアなど)書かれた/維持された。

アルゴリズムとユーティリティが適切にユニットテストされている場合、データを一貫性のない状態にすることについて心配する必要はありません。しかし、これらが非常に重要なシステム/インタフェースである場合は、出力時にいくつかの検証を追加することができます。一般的に、入力時にデータの検証とマーシャリングを行うのがよい方法です。ユーティリティメソッドの

説明: あなたはデータ配列を持っている場合は、次に

var data = [{"id":"i_1", ...}, {"id":"i_2", ...},{"id":"i_3",....}]; 

を言うと、あなたがその外のインデックスを作成したり、元の配列に基づいて、より多くのデータセットを作成し、その後、あなたが作成する必要があります配列上の変更を行い、派生データセットを作成したり、配列を繰り返したり、その結果として得られたアイテムを作成したりするユーティリティメソッドのライブラリです。例:

var createIndex = function(arr){ 
    // do something that converts the data array with expected structure to object 
    // { 
    //  i_1: {"id":"i_1", ...}, 
    //  i_2: {"id":"i_2", ...}, 
    //  i_3: {"id":"i_3", ...} 
    return newObj; 
} 

この方法では、データにアクセスするためのハッシュマップが作成されます。このマップは、元のアレイよりも高速に繰り返し実行されます。しかし、今では、このメソッドを簡単にユニットテストすることができますし、ソースデータで目的のデータセットを取得するときに矛盾がないことを確認してください。

+0

ポイント1で合意しました。それが私が質問した全体の理由です。 'ユーティリティメソッド'が色[s]よりも高速なアクセスを許可する方法について詳しく説明できますか?私は思考の列車に従わない。 – Richard

+0

@リチャードは回答に明確な説明を追加しました –

1

私は重複を避けるために他の方法で[キー]ダイレクトアクセスを変更しません。 これ以外の試みは処理につながり、大量のデータがあると述べました。

重複が受信データを浪費していると仮定します。 ネットワークデータを使用して処理する例は、マップオブジェクトを経由し、キーに従って動的にIDを設定することです。 (処理対トラフィック)

colours[key].id = key 
+0

質問が十分に明確でない場合は、私に許してください。重複したオブジェクトはありません。コードは正常に動作します。重複は、キーが2回格納されるため、(理論的に)矛盾する可能性があります。 実際の不具合は修正されていません。私は、このような魅力的でないデザインを避けるためのヒントを探していました。 – Richard

+0

私は理解しましたが、あなたが説明したようにデータがサーバーから来ていますか?もしそうなら、なぜあなたのようなソリューションに固執し、それを変更したくないのかという理由を説明しようとしました。誰かのような他のソリューションは、大きなデータを扱うときには時間がかかる処理になるからです。私があなたに与えた例は、処理を追加し、クライアントで処理できる不要な重複データを取り除きます - 私はgreen:{vals:[0,1,0]}の代わりにgreen:{id: "green" vals:[0,1,0]}小さいデータトラフィック – lastboy

1

オブジェクトをフィルタリングしてオブジェクトの配列に変換し、一意の値をフィルタリングできます。これを配列に変換すると、多くの操作をより迅速かつ簡単に実行できます。

ですから、配列に、あなたのオブジェクトをマッピングすることができます

var coloursArray = myObj.map(function(value, index) { 
    return [value]; 
}); 

は、重複を削除します。

function removeDuplicates() { 
    return coloursArray.filter((obj, pos, arr) => { 
     return arr.map(mapObj => mapObj[id]).indexOf(obj[id]) === pos; 
    }); 
} 

あなたが例えば使用して配列から重複を削除することができますが.uniq methodを通じてunderscore.js:

var uniqueColoursArray = _.uniq(coloursArray , function(c){ return c.id; }); 

さらに、この機能はかなり役に立たないそれはまたgetcolour(s)よりも短くなっている

function getcolour(s){return colours[s];} 

colours[s]を呼び出す:あなたは、直接あなたの要素にアクセスすることができます。他のスコープではアクセスできないため、配列を渡すと関数が意味を持ちます。

あなたがここにパラメータとしてはconsole.logを渡すなぜその後、私は理解することはできません。

colour.prototype.identify(console.log(this.id)); 

多分あなただけのthis.id

+0

私は問題をはっきり説明していないことを恐れています。 配列から重複要素を削除しようとしていません。私は、データム(id)が2つの別々の場所に格納されることによって複製されることを懸念しています。囲むオブジェクトのキーと子オブジェクトのプロパティです。 私はこれを避けるために見落としてしまった巧妙な設計方法があるかどうか、単に疑問に思っていました。 – Richard

+0

ええ、それは明らかではありませんでした。 'var colors = [ {id:" red "、vals:[1,0,0]}、 {id:" green "、vals:[0,1,0] }、 {id: "gray"、vals:[0.5,0.5,0.5]} ]; ' – quirimmo

関連する問題