2016-05-16 65 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 (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是一個簡單檢查值是否以(值)開頭的函數。

在JS中是否已經有一個函數來映射兩個對象數組? (我也遇到了邏輯問題,因爲「前綴」值基本上必須從上到下,因爲不會落在默認的「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 
    } 
} 

的進一步深入,你甚至會覺得有些遞歸解決方案爲後備。