2016-05-16 5 views
1

私はこのようなオブジェクトの配列を持っています。オブジェクトの配列に動的な値を挿入する、javascript

[ 
{Number: 5002000, Origin: 123456, Count: 128}, 
{Number: 5002300, Origin: 900231, Count: 52}, 
{Number: 5002022, Origin: 534323, Count: 269} 
] 

ここでは、「数」の値に指定した価格プールの値を掛けようとしています。

これは次のようなものです。

[ 
{Prefix: 50023, Price: 20},  
{Prefix: 50020, Price: 10}, 
{Prefix: 5002, Price: 60}, 
] 

現在のところ、if文を使用した恐ろしいforループがあります。

for (var key in sData) { 
    if (sData[key].Origin.startsWith('50023')) { 
    sData[key].sum = (sData[key].Count * 20); 
    } 
    else if (sData[key].Origin.startsWith('50020')) { 
    sData[key].sum = (sData[key].Count * 10); 
    } 
    // continues... 
} 

startsWithは、値が(value)で始まるかどうかを確認する関数です。

オブジェクトの2つの配列をマップするJSの関数は既にありますか? ( "Prefix"の値は基本的に、デフォルトの "5002"プレフィックスにならないように上から下に移動する必要があるため、論理に問題があります。)

+0

であるが、接頭辞「5002」は残りの接頭語をカバーする。優先順位は何ですか? – RomanPerekhrest

答えて

1

この状況では、ネストループを使用する必要があります。またArray.forEachメソッドに切り替えます。

二番目の配列をハッシュに変換することができますと仮定すると
sData.forEach(function(item_, key) { 

      prices.forEach(function(item) { 

      if (sData[key].Origin.startsWith(item.Prefix)) { 
       sData[key].sum = (sData[key].Count * item.Price); 
      } 

      }); 

}) 
+0

それは簡単でした。 – HenrikM

+0

'sData'配列のアイテムを操作するとき、' map '(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)は ' forEach' – ste2425

+0

偉大な働き、ありがとう! – HenrikM

1

var tiers = { 
    50023: {Prefix: 50023, Price: 20},  
    50020: {Prefix: 50020, Price: 10}, 
    5002: {Prefix: 5002, Price: 60}, 
} 

あなたはそれがこのように見えるように可能性があります

for (var key in sData) { 
    var key = String(sData[key]) 
    var keyIndex = key.slice(5) 

    if (tiers.hasOwnProperty(keyIndex)) { 
     var price = tiers[keyIndex].Price 
     sData[key].sum = (sData[key].Count * price) 
    } else { 
     // Fallback solution 
    } 
} 

あなたも、いくつかの再帰的な解決策を考えることがあり、さらに行きますフォールバックのため。

関連する問題