将动态值插入到对象数组中,javascript

时间:2016-05-16 06:47:30

标签: javascript arrays iterator javascript-objects

我有一个看起来像这样的对象数组;

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

现在我试图将" Count"值与指定价格池中的值。

看起来像这样;

[
{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中是否已有一个函数来映射两个对象数组? (由于" Prefix&#34,我也有逻辑问题;值基本上必须从上到下,因为没有登陆默认" 5002" -prefix。)

2 个答案:

答案 0 :(得分: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);
             }

          });  

 })

答案 1 :(得分: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
    }
}

更进一步,你甚至可能会想到一些回退的递归解决方案。